- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Pku acm 1163 the Triangle 动态规划题目总结(一)
题目:/JudgeOnline/problem?id=1163
对于一个有数字组成的二叉树,求由叶子到根的一条路径,使数字和最大,如:
7
8
8 1 0
2 7 4 4
4 5 2 6 5
这个是经典的动态规划,也是最最基础、最最简单的动态规划,典型的多段图。思路就是建立一个数组,由下向上动态规划,保存页子节点到当前节点的最大值,Java核心代码如下:
for(int i=num-2;i=0;i--){
for(int j=0;j=i;j++){
//该句是整个动态规划的核心
number[i][j]=Math.max(number[i+1][j],number[i+1][j+1])+number[i][j];
}
}
带有详细注释的代码可以在/user/china8848/获得
Pku acm 1579 Function Run Fun 动态规划题目总结(二)
/JudgeOnline/problem?id=1579
Consider a three-parameter recursive function w(a, b, c): if a = 0 or b = 0 or c = 0, then w(a, b, c) returns: 1 if a 20 or b 20 or c 20, then w(a, b, c) returns: w(20, 20, 20) if a b and b c, then w(a, b, c) returns: w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) otherwise it returns: w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
这本身就是一个递归函数,要是按照函数本身写递归式,结果肯定是TLE,这里我开了一个三维数组,从w(0,0,0)开始递推,逐步产生到w(20,20,20)的值,复杂度O(n^3).
总结:这道题是很地道的DP,因为它的子问题实在是太多了,所以将问题的结果保存起来,刘汝佳《算法艺术和信息学竞赛》中115页讲到自底向上的递推,这个例子就非常典型。总体来说这个题目还是非常简单的,不过这个思想是地道的动态规划。
带有详细注释的代码可以在/user/china8848/获得
Pku acm 2081 Recamans Sequence 动态规划题目总结(三)
/JudgeOnline/problem?id=2081一道很简单的动态规划,根据一个递推公式求一个序列,我选择顺序的求解,即自底向上的递推,一个int数组result根据前面的值依此求出序列的每一个结果,另外一个boolean数组flag[i]记录i是否已经出现在序列中,求result的时候用得着,这样就避免了查找。核心的java代码为:
for(i=1;i=500000;i++)
{
if(result[i-1]-i0flag[result[i-1]-i]==false)
{
result[i] = result[i-1]-i;
flag[result[i-1]-i] = true;
}
else
{
result[i] = result[i-1]+i;
flag[result[i-1]+i] = true;
}
}
带有详细注释的代码可以在/user/china8848/获得
Pku acm 1953 World Cup Noise 动态规划题目总结(四)
/JudgeOnline/problem?id=1953
给定一个小于45的整数n,求n位2进制数中不含相邻1的数的个数。看似简单的一道题,如果当n=45时,对2的45次方检查,是无法完成的任务。先分析一下这个问题:
N 以1结尾的个数 以0结尾的个数 总和 1 1 1 2 2 1 2 3 3 … … … 对于n=1来说,以1结尾、以0结尾个数都是1,总和是2,下面过度到2:对于所有以1结尾的数,后面都可以加上0,变为n=2时以0结尾的,而只有结尾为0的数才能加上1(因为不能有两个连续0),这样就可以在n=2的格里分别填上1、2,总和算出来为3,以此类推,我们可以算出所有n=45的值,然后根据输入进行相应输出。核心代码如下:
int i,num,count,arra
文档评论(0)