动态规划讲解大全含例题及答案
动态规划练习题及解答1

动态规划练习题[题1] 多米诺骨牌(DOMINO)问题描述:有一种多米诺骨牌是平面的,其正面被分成上下两部分,每一部分的表面或者为空,或者被标上1至6个点。
现有一行排列在桌面上:顶行骨牌的点数之和为6+1+1+1=9;底行骨牌点数之和为1+5+3+2=11。
顶行和底行的差值是2。
这个差值是两行点数之和的差的绝对值。
每个多米诺骨牌都可以上下倒置转换,即上部变为下部,下部变为上部。
现在的任务是,以最少的翻转次数,使得顶行和底行之间的差值最小。
对于上面这个例子,我们只需翻转最后一个骨牌,就可以使得顶行和底行的差值为0,所以例子的答案为1。
输入格式:文件的第一行是一个整数n(1〈=n〈=1000〉,表示有n个多米诺骨牌在桌面上排成一行。
接下来共有n行,每行包含两个整数a、b(0〈=a、b〈=6,中间用空格分开〉。
第I+1行的a、b分别表示第I个多米诺骨牌的上部与下部的点数(0表示空)。
输出格式:只有一个整数在文件的第一行。
这个整数表示翻动骨牌的最少次数,从而使得顶行和底行的差值最小。
[题2] Perform巡回演出题目描述:Flute市的Phlharmoniker乐团2000年准备到Harp市做一次大型演出,本着普及古典音乐的目的,乐团指挥L.Y.M准备在到达Harp市之前先在周围一些小城市作一段时间的巡回演出,此后的几天里,音乐家们将每天搭乘一个航班从一个城市飞到另一个城市,最后才到达目的地Harp市(乐团可多次在同一城市演出).由于航线的费用和班次每天都在变,城市和城市之间都有一份循环的航班表,每一时间,每一方向,航班表循环的周期都可能不同.现要求寻找一张花费费用最小的演出表.输入: 输入文件包括若干个场景.每个场景的描述由一对整数n(2<=n<=10)和k(1<=k<=1000)开始,音乐家们要在这n个城市作巡回演出,城市用1..n标号,其中1是起点Flute市,n是终点Harp市,接下来有n*(n-1)份航班表,一份航班表一行,描述每对城市之间的航线和价格,第一组n-1份航班表对应从城市1到其他城市(2,3,...n)的航班,接下的n-1行是从城市2到其他城市(1,3,4...n)的航班,如此下去.每份航班又一个整数d(1<=d<=30)开始,表示航班表循环的周期,接下来的d个非负整数表示1,2...d天对应的两个城市的航班的价格,价格为零表示那天两个城市之间没有航班.例如"3 75 0 80"表示第一天机票价格是75KOI,第二天没有航班,第三天的机票是80KOI,然后循环:第四天又是75KOI,第五天没有航班,如此循环.输入文件由n=k=0的场景结束.输出:对每个场景如果乐团可能从城市1出发,每天都要飞往另一个城市,最后(经过k天)抵达城市n,则输出这k个航班价格之和的最小值.如果不可能存在这样的巡回演出路线,输出0.样例输入: 样例输出:3 6 4602 130 150 03 75 0 807 120 110 0 100 110 120 04 60 70 60 503 0 135 1402 70 802 32 0 701 800 0[题3] 复制书稿(BOOKS)问题描述:假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。
动态规划-例题众多-详细讲解

步骤2:状态转移方程:
步骤3:以自底向上的方法来计算最优解
12
程序的实现
BuyTicks(T, R)
1 n ← length[T]
2 f[0] ← 0
3 f[1] ← T[1]
4 for i ← 2 to n do
5
f[i] ← f[i-2]+R[i-1]
6
if f[i] > f[i-1]+T[i] then
n 0 1 2 3 4 5 6 7 8 9 10 F(n) 1 1 2 3 5 8 13 21 34 55 89
2
递归 vs 动态规划
递归版本:
F(n)
1 if n=0 or n=1 then
2
return 1
3 else
4
return F(n-1) + F(n-2)
太慢!
动态规划:
F(n)
1 A[0] = A[1] ← 1
这里是某支股票的价格清单: 日期 1 2 3 4 5 6 7 8 9 10 11 12 价格 68 69 54 64 68 64 70 67 78 62 98 87 最优秀的投资者可以购买最多4次股票,可行方案中的一种是: 日期 2 5 6 10 价格 69 68 64 62 输入 第1行: N (1 <= N <= 5000),股票发行天数 第2行: N个数,是每天的股票价格。 输出 输出文件仅一行包含两个数:最大购买次数和拥有最大购买次数的方案数(<=231) 当二种方案“看起来一样”时(就是说它们构成的价格队列一样的时候),这2种方 案被认为是相同的。
你的任务是,已知所有N位同学的身高,计算最少需要 几位同学出列,可以使得剩下的同学排成合唱队形。
动态规划典型案例解析及计算过程梳理

动态规划典型案例解析及计算过程梳理动态规划(Dynamic Programming)是一种通过将问题分解为子问题来解决复杂问题的算法策略。
它通常用于优化问题,通过将问题的解决方案划分为相互重叠的子问题来降低计算复杂度。
下面将通过几个典型案例,详细解析动态规划的应用及其计算过程。
1. 斐波那契数列斐波那契数列是一种经典的动态规划问题。
它的定义是:F(n) =F(n-1) + F(n-2),其中F(0) = 0,F(1) = 1。
我们需要计算第n个斐波那契数。
通过动态规划的思想,可以将该问题划分为子问题,即计算第n-1和第n-2个斐波那契数。
可以使用一个数组来保存已经计算过的斐波那契数,避免重复计算。
具体的计算过程如下:1. 初始化一个长度为n+1的数组fib,将fib[0]设置为0,fib[1]设置为1。
2. 从i=2开始遍历到n,对于每个i,计算fib[i] = fib[i-1] + fib[i-2]。
3. 返回fib[n]作为结果。
通过上述过程,我们可以快速地得到第n个斐波那契数。
这个案例展示了动态规划的重要特性,即将问题分解为子问题进行求解,并利用已经计算过的结果来避免重复计算。
2. 背包问题背包问题是另一个常见的动态规划问题。
问题的定义是:有一组物品,每个物品有自己的重量和价值,在限定的背包容量下,如何选择物品使得背包中的总价值最大化。
通过动态规划的思想,背包问题可以被划分为子问题。
我们可以定义一个二维数组dp,其中dp[i][j]表示在前i个物品中,背包容量为j时的最大价值。
具体的计算过程如下:1. 初始化一个大小为n+1行,m+1列的二维数组dp,其中n为物品数量,m为背包容量。
将所有元素初始化为0。
2. 从i=1开始遍历到n,对于每个i,从j=1开始遍历到m,对于每个j,进行如下判断:- 若当前物品的重量大于背包容量j,则dp[i][j] = dp[i-1][j],即不选择当前物品;- 若当前物品的重量小于等于背包容量j,则dp[i][j] = max(dp[i-1][j], dp[i-1][j-wi] + vi),即选择当前物品或不选择当前物品所能获得的最大价值。
动态规划 例题众多 详细讲解

最优秀的投资者可以购买最多4次股票,可行方案中的一种是:
日期 2 5 6 10
价格 69 68 64 62
输入
第1行: N (1 <= N <= 5000),股票发行天数
第2行: N个数,是每天的股票价格。
输出
输出文件仅一行包含两个数:最大购买次数和拥有最大购买次数的方案数(<=231)
当二种方案“看起来一样”时(就是说它们构成的价格队列一样的时候),这2种方
步骤2
最优子结构性质:
设序列Xm={x1,x2,…,xm}和Yn={y1,y2,…,yn}的一个最长公共子 序列为Zk={z1,z2,…,zk},则
1.若xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序 列。
2.若xm≠yn,且zk≠xm,则Zk是Xm-1和Yn的最长公共子序列。 3.若xm≠yn,且zk≠ yn ,则Zk是Xm和Yn-1的最长公共子序列。
• 重叠子问题:在用递归算法自顶向下解问 题时,每次产生的子问题并不总是新问题 ,有些问题被反复计算多次。对每个子问 题只解一次,然后将其解保存起来,以后 再遇到同样的问题时就可以直接引用,不 必重新求解。
2020/3/5
6
动态规划 解决问题的基本特征
1. 动态规划一般解决最值(最优,最 大,最小,最长……)问题;
2020/3/5
15
拓展2:低价购买
“低价购买”这条建议是在奶牛股票市场取得成功的一半规则。要想被认为是伟
大的投资者,你必须遵循以下的问题建议:“低价购买;再低价购买”。每次你购买
一支股票,你必须用低于你上次购买它的价格购买它。买的次数越多越好!你的目标
是在遵循以上建议的前提下,求你最多能购买股票的次数。你将被给出一段时间内
05-动态规划解析

6sk
f
* K 1
(0.96sk
0.21xk )},k
4,3,2,1
最少费用运输问题
出
2
发 城
Q4
市3
城市A A1 7 4 6
3 A2 2
4
41 A3 5 3个转运点
城市B B1 1 4
6 B2 3
3 B3 3 3个转运点
城市C 3 C1 3
4 4
C2
海 T港
2个转运点 动态规划求解表
最少费用运输问题
动态规划
>>
最少费用运输问题
将货物从城市Q运到海港T,途中经过城市A、B、C,
三个城市各有3、3、2个转运点,各点运费如图,
求从Q到T的最优路线,使总运费最少。
城市A
城市B
城市C
出2
发 城
Q
4
市3
A1 7 64
3 A2 2
4
41 A3 5
3个转运点
B1 4
1
B2
6 3
3 B3 3
3个转运点
C1 3
C2 4
2个转运点
海
T港
动态规划
动态规划是解决多阶段决策过程最优化问题的 一种方法。由美国数学家贝尔曼(Ballman) 等人在20世纪50年代提出。他们针对多阶段决 策问题的特点,提出了解决这类问题的“最优 化原理”,并成功地解决了生产管理 、 工程 技术等方面的许多实际问题。
动态规划
动态规划是现代企业管理中的一种重要决策 方法,可用于最优路径问题、资源分配问题、 生产计划和库存问题、投资问题、装载问题、 排序问题及生产过程的最优控制等。
动态规划的基本概念
阶段 状态 决策和策略 状态转移 指标函数
第9章 动态规划应用举例习题详解习题.doc

第9章动态规划应用举例习题详解(习题)9. 1有一部货车每天沿着公路给四个零售店卸下6箱货物,如果各零售店出售该货物所得利润如表9-1所示,试求在各零售店卸下几箱货物,能使获得总利润最大?其值是多少?9.2设有某种肥料共6个单位重量,准备供给四块粮田用。
其每块田施肥数量与增产粮食数字关系如表9-2所示。
试求对每块田施多少单位重量的肥料,才使总的增产粮食最多。
粮田增肥1234000001202518282424539473605761654756578745857090806907395859.3某公司打算向它的三个营业区增设六个销售店,每个营业区至少增设一个。
从各区赚取的利润(单位为万元)与增设的销售店个数有关,其数据如表9-3所示。
销售店增加数A区利润B区利润C区利润9.4某工厂有100台机器,拟分四个周期使用,在每一周期有两种生产任务。
据经验,把机器q 台投入第一种生产任务,则在一个生产周期中将有;n/3台机器作废;余下的机器全部投入第二种生产任务,则有1/10台机器作废。
如果干第一种生产任务每台机器可收益10, 干第二种生产任务每台机器可收益7。
问怎样分配机器,使总收益最大?9. 5设有三种资源,每单位的成本分别为a、b. co给定的利润函数为n(xi, yi,z),(/ = 1,2,•••,«)现有资金为W,应购买各种资源多少单位分配给"个行业,才能使总利润最大。
试给出动态规划的公式,并写出它的一维递推关系式。
9. 6某厂生产一种产品,估计该产品在未来4个月的销售量分别为400、500、300、200件。
该项产品的生产准备费用每批为500元,每件的生产费用为1元,存储费用每件每月为1 元。
假定1月初的存货为100件,4月底的存货为零。
试求该厂在这4个月内的最优生产计划。
9.7某电视机厂为生产电视机而需生产喇叭,生产以万只为单位。
根据以往记录,一年的四个季度需要喇叭分别是3万、2万、3万、2万只。
精讲动态规划

最长单增子序列LIS——续
时间复杂度
枚举i 枚举x,找到最大的满足条件的x O(n2)
空间复杂度
存储每个f(i) O(n)
如何得到解?
记录决策:对每个f(i)记录得到它的决策x
3
精选例题2:旅行商问题TSP
TSP (Traveling Salesman Problem) n个城市, 仸意两个城市之间有一定距离,从一个城市 出发经历所有的城市一次并且仅仅一次,最 终回到起点,使得所有距离最短? (最小代 价圈) 确定状态
本行结果只与“上一行”相关14Fra bibliotek推荐读物
算法导论 算法设计 (Cornell algorithm design) 算法设计与分析 ……
15
5
旅行商问题TSP——续II
费用表示: f(s,x) = min {f(s – x, y) + distance(y,x) }其中s-x表 示从集合s中去掉城市x之后的集合, y在集合s-x中 注意点: 最后回到起点的状态有点特殊,因为起点已经在 集合里 复杂度 集合数2n 状态数 2n * n 时间
顺序?假设已经经历了ABCDE这5个城市,最终 在城市E,那么A,B,C,D的顺序重要么? f(s,x)表示状态
s表示经历过的城市集合。 4
旅行商问题TSP——续I
X表示最后一个城市,在集合s里 f(s,x)表示经过s集合里那些城市,最终在城市x 时所经过的最小距离。 初始状态: f({1},1) = 0,假设从城市1开始 终止状态:f({1,2,3,..n},1)=? 决策: 在状态(s, x)找到一个不在集合s里的城市y, 若从x走到y,则f(s,x) + distance(x,y)是一个经过集合 sUy城市的路径。 无后效性:收益只取决于状态(s,x)和决策y
动态规划入门

输入数据 输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出
序列中的N个整数,这些整数的取值范围都在0到10000。 输出要求
最长上升子序列的长度。 输入样例 7 1735948 输出样例 4
解题思路
1.找子问题
“求序列的前n个元素的最长上升子序列的长度”是个 子问题,但这样分解子问题,不具有“无后效性”
数字三角形的记忆递归型动归程序:
#include <iostream> #include <algorithm> using namespace std;
#define MAX 101
int D[MAX][MAX];
int n;
int maxSum[MAX][MAX];
int MaxSum(int i, int j){ if( maxSum[i][j] != -1 ) return maxSum[i][j]; if(i==n) maxSum[i][j] = D[i][j]; else { int x = MaxSum(i+1,j); int y = MaxSum(i+1,j+1); maxSum[i][j] = max(x,y)+ D[i][j]; } return maxSum[i][j];
数字三角形的状态转移方程:
能用动规解决的问题的特点
1) 问题具有最优子结构性质。如果问题的最优解所包含的 子问题的解也是最优的,我们就称该问题具有最优子结 构性质。
2) 无后效性。当前的若干个状态值一旦确定,则此后过程 的演变就只和这若干个状态的值有关,和之前是采取哪 种手段或经过哪条路径演变到当前的这若干个状态,没 有关系。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态规划讲解大全动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。
1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。
动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。
例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。
虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。
动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。
不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。
动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。
因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。
我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。
基本模型多阶段决策过程的最优化问题。
在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。
当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线,如图所示:(看词条图)这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题就称为多阶段决策问题。
记忆化搜索给你一个数字三角形, 形式如下:12 34 5 67 8 9 10找出从第一层到最后一层的一条路,使得所经过的权值之和最小或者最大.无论对与新手还是老手,这都是再熟悉不过的题了,很容易地,我们写出状态转移方程:f(i, j)=a[i, j] + min{f(i+1, j),f(i+1, j + 1)}对于动态规划算法解决这个问题,我们根据状态转移方程和状态转移方向,比较容易地写出动态规划的循环表示方法。
但是,当状态和转移非常复杂的时候,也许写出循环式的动态规划就不是那么简单了。
解决方法:我们尝试从正面的思路去分析问题,如上例,不难得出一个非常简单的递归过程:f1:=f(i-1,j+1); f2:=f(i-1,j);if f1>f2 then f:=f1+a[i,j] else f:=f2+a[i,j];显而易见,这个算法就是最简单的搜索算法。
时间复杂度为2n,明显是会超时的。
分析一下搜索的过程,实际上,很多调用都是不必要的,也就是把产生过的最优状态,又产生了一次。
为了避免浪费,很显然,我们存放一个opt数组:Opt[i, j] - 每产生一个f(i, j),将f(i, j)的值放入opt中,以后再次调用到f(i, j)的时候,直接从opt[i, j]来取就可以了。
于是动态规划的状态转移方程被直观地表示出来了,这样节省了思维的难度,减少了编程的技巧,而运行时间只是相差常数的复杂度,避免了动态规划状态转移先后的问题,而且在相当多的情况下,递归算法能更好地避免浪费,在比赛中是非常实用的.状态决策决策:当前状态通过决策,回到了以前状态.可见决策其实就是状态之间的桥梁。
而以前状态也就决定了当前状态的情况。
数字三角形的决策就是选择相邻的两个以前状态的最优值。
状态:我们一般在动规的时候所用到的一些数组,也就是用来存储每个状态的最优值的。
我们就从动态规划的要诀,也就是核心部分“状态”开始,来逐步了解动态规划。
有时候当前状态确定后,以前状态就已经确定,则无需枚举.动态规划算法的应用一、动态规划的概念近年来,涉及动态规划的各种竞赛题越来越多,每一年的NOI几乎都至少有一道题目需要用动态规划的方法来解决;而竞赛对选手运用动态规划知识的要求也越来越高,已经不再停留于简单的递推和建模上了。
要了解动态规划的概念,首先要知道什么是多阶段决策问题。
1. 多阶段决策问题如果一类活动过程可以分为若干个互相联系的阶段,在每一个阶段都需作出决策(采取措施),一个阶段的决策确定以后,常常影响到下一个阶段的决策,从而就完全确定了一个过程的活动路线,则称它为多阶段决策问题。
各个阶段的决策构成一个决策序列,称为一个策略。
每一个阶段都有若干个决策可供选择,因而就有许多策略供我们选取,对应于一个策略可以确定活动的效果,这个效果可以用数量来确定。
策略不同,效果也不同,多阶段决策问题,就是要在可以选择的那些策略中间,选取一个最优策略,使在预定的标准下达到最好的效果.2.动态规划问题中的术语阶段:把所给求解问题的过程恰当地分成若干个相互联系的阶段,以便于求解,过程不同,阶段数就可能不同.描述阶段的变量称为阶段变量。
在多数情况下,阶段变量是离散的,用k表示。
此外,也有阶段变量是连续的情形。
如果过程可以在任何时刻作出决策,且在任意两个不同的时刻之间允许有无穷多个决策时,阶段变量就是连续的。
在前面的例子中,第一个阶段就是点A,而第二个阶段就是点A到点B,第三个阶段是点B到点C,而第四个阶段是点C到点D。
状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因素。
在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点。
在前面的例子中,第一个阶段有一个状态即A,而第二个阶段有两个状态B1和B2,第三个阶段是三个状态C1,C2和C3,而第四个阶段又是一个状态D。
过程的状态通常可以用一个或一组数来描述,称为状态变量。
一般,状态是离散的,但有时为了方便也将状态取成连续的。
当然,在现实生活中,由于变量形式的限制,所有的状态都是离散的,但从分析的观点,有时将状态作为连续的处理将会有很大的好处。
此外,状态可以有多个分量(多维情形),因而用向量来代表;而且在每个阶段的状态维数可以不同。
当过程按所有可能不同的方式发展时,过程各段的状态变量将在某一确定的范围内取值。
状态变量取值的集合称为状态集合。
无后效性:我们要求状态具有下面的性质:如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响,所有各阶段都确定时,整个过程也就确定了。
换句话说,过程的每一次实现可以用一个状态序列表示,在前面的例子中每阶段的状态是该线路的始点,确定了这些点的序列,整个线路也就完全确定。
从某一阶段以后的线路开始,当这段的始点给定时,不受以前线路(所通过的点)的影响。
状态的这个性质意味着过程的历史只能通过当前的状态去影响它的未来的发展,这个性质称为无后效性。
决策:一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的一种选择(行动)称为决策。
在最优控制中,也称为控制。
在许多间题中,决策可以自然而然地表示为一个数或一组数。
不同的决策对应着不同的数值。
描述决策的变量称决策变量,因状态满足无后效性,故在每个阶段选择决策时只需考虑当前的状态而无须考虑过程的历史。
决策变量的范围称为允许决策集合。
策略:由每个阶段的决策组成的序列称为策略。
对于每一个实际的多阶段决策过程,可供选取的策略有一定的范围限制,这个范围称为允许策略集合。
允许策略集合中达到最优效果的策略称为最优策略。
给定k阶段状态变量x(k)的值后,如果这一阶段的决策变量一经确定,第k+1阶段的状态变量x(k+1)也就完全确定,即x(k+1)的值随x(k)和第k阶段的决策u(k)的值变化而变化,那么可以把这一关系看成(x(k),u(k))与x(k+1)确定的对应关系,用x(k+1)=Tk(x(k),u(k))表示。
这是从k 阶段到k+1阶段的状态转移规律,称为状态转移方程。
最优性原理:作为整个过程的最优策略,它满足:相对前面决策所形成的状态而言,余下的子策略必然构成“最优子策略”。
D也是B1到D的最短路径……──事实正是如此,因此我们认为这个例子满足最优性原理的要求。
◊C2◊C2是A到C2的最短路径,B1◊B1◊D,这些点的选择构成了这个例子的最优策略,根据最优性原理,这个策略的每个子策略应是最优:A◊C2◊B1◊最优性原理实际上是要求问题的最优策略的子策略也是最优。
让我们通过对前面的例子再分析来具体说明这一点:从A到D,我们知道,最短路径是A动态规划练习题USACO 2.2 Subset Sums题目如下:对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。
举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:and {1,2}这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:{1,6,7} and {2,3,4,5} {注1+6+7=2+3+4+5}{2,5,7} and {1,3,4,6}{3,4,7} and {1,2,5,6}{1,2,4,7} and {3,5,6}给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。
程序不能预存结果直接输出。
PROGRAM NAME: subsetINPUT FORMAT输入文件只有一行,且只有一个整数NSAMPLE INPUT ()7OUTPUT FORMAT输出划分方案总数,如果不存在则输出0。
SAMPLE OUTPUT ()4参考程序如下:#include <fstream>using namespace std;const unsigned int MAX_SUM = 1024;int n;unsigned long long int dyn[MAX_SUM];ifstream fin ("subset.in");ofstream fout ("subset.out");int main() {fin >> n;fin.close();int s = n*(n+1);if (s % 4) {fout << 0 << endl;fout.close ();return ;}s /= 4;int i, j;dyn [0] = 1;for (i = 1; i <= n; i++)for (j = s; j >= i; j--)dyn[j] += dyn[j-i];fout << (dyn[s]/2) << endl;fout.close();return 0;}USACO 2.3 Longest Prefix题目如下:在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。