2011年2月23日

poj 1651

摘要: 题目描述:依次从左到右给你n个数字,每次取出一个数字(这个数字不能是最两边的数字),这个数字和它左右两边的数字(一共三个数字)相乘,累加这个数。直到最后仅剩下两个数字。求最后累加的最小值。对于整个牌的序列,最左端和最右端的牌是不能被取走的,除这两张以外的所有牌,必然有一张最后取走。取走这最后一张牌有一个仅与它本身以及最左端和最右端的牌的值有关的得分,这个分值与其他牌没有任何关系。当这张最后被取走的牌被定下来以后(假设位置为j), 最左端到j之间的所有牌被取走时所造成的得分必然只与这之间的牌有关从而与j到最右端之间的牌独立开来。这样就构成了两个独立的子区间,出现重叠子问题。于是问题的解就是 取走 阅读全文

posted @ 2011-02-23 16:29 宇宙吾心 阅读(266) 评论(0) 推荐(0)

poj 3661

摘要: 题目描述:一个人(牛。。。)跑步,开始时劳累程度是0,一共有N分钟,如果第i分钟跑步的话,能跑di的距离。同时劳累程度加1,如果这一分钟休息的话,劳累程度减一,而且如果一旦休息,就一定要休息到劳累程度为0时才能继续跑。问第N分钟劳累程度是0的时候最多能跑多远。解题报告:dpdp[i][j] = dp[i - 1][j - 1] di ( j> 0 )dp[i][0] = max (dp[i - 1][0], dp[k][j-k](j- k>= k && k<= M))代码:#include<iostream>#include<fstream& 阅读全文

posted @ 2011-02-23 14:36 宇宙吾心 阅读(298) 评论(0) 推荐(0)

poj 1949

摘要: 题目描述:有n个任务,第i个任务需要时间xi来完成,并且第i个任务必须在它 “前面的” 某些任务完成之后才能开始。给你任务信息,问你最短需要多少时间来完成任务。解题报告:“前面的”,知道这些任务已经是top排序好的了。dp[i] = 完成第i个任务时所需的最短的时间。dp[i] = max(dp[j]) xi, j是需要在它前面完成的任务的序号。max(dp[i])就是答案。代码:#include<iostream>#include<fstream>using namespace std;int dp[10001];void read(){// ifstream cin 阅读全文

posted @ 2011-02-23 13:28 宇宙吾心 阅读(692) 评论(0) 推荐(0)

poj 2576 动态规划

摘要: 题目描述:n个人,每个人体重x[i],让你把他们分成两组,两组之间的人数差不能大于1。输出两组体重差最小的情况。解题报告:dpdp[i] = 1,表示体重和为i可以达到。mark[i][j] = 1,表示i个人可以构成体重j.代码:#include<iostream>#include<fstream>#include<cmath>using namespace std;int n;int dp[45001];int mark[101][45001];int a[101];void read(){// ifstream cin("in.txt&quo 阅读全文

posted @ 2011-02-23 12:11 宇宙吾心 阅读(445) 评论(0) 推荐(0)

poj 2537 动态规划

摘要: 题目描述:一段文章仅由0 ~k k +1个数字组成,要求相邻两个数字的差值不能大于1.问文章长度n时,合法的文章占所有文章的百分比。解题报告:dp[i][j] = dp[i - 1][j] + dp[i - 1][j + 1] + dp[i - 1][j -1];dp[i][j]表示文章第i个数字是j时的情况种数。那么第i位的数字种数的和sum,再除以所有种数(k+1)^n就是答案。代码:#include<iostream>#include<fstream>#include<cmath>using namespace std;double dp[20][20 阅读全文

posted @ 2011-02-23 10:35 宇宙吾心 阅读(214) 评论(0) 推荐(1)

poj pku 3014 整数划分

摘要: 题目描述:给你m个东西,放在n个相同的盒子中(相同,即不计顺序),每个盒子可以放任意多,问有多少种放法。解题报告:整数划分问题。dp[i][j]表示j个东西放i个盒子中的方法数。则i个盒子的状态只有2种:有空的,和没有空的。即dp[i][j] = 有空的 + 没有空的。情况1:j < i没有空的方法数为0,有空的时,把一个盒子单独拿出来当做空的,剩下的任意放就是dp[i - 1][j]综上,dp[i][j] = dp[i - 1][j] + 0情况2:j == i没有空的时,有且仅有一种情况。有空的时,方法同上,单独取出一个,方法数:dp[i - 1][j]综上 dp[i][j] = d 阅读全文

posted @ 2011-02-23 10:08 宇宙吾心 阅读(240) 评论(0) 推荐(0)

poj 3014 整数划分

摘要: 题目描述:给你m个东西,放在n个相同的盒子中(相同,即不计顺序),每个盒子可以放任意多,问有多少种放法。解题报告:整数划分问题。dp[i][j]表示j个东西放i个盒子中的方法数。则i个盒子的状态只有2种:有空的,和没有空的。即dp[i][j] = 有空的 + 没有空的。情况1:j < i没有空的方法数为0,有空的时,把一个盒子单独拿出来当做空的,剩下的任意放就是dp[i - 1][j]综上,dp[i][j] = dp[i - 1][j] + 0情况2:j == i没有空的时,有且仅有一种情况。有空的时,方法同上,单独取出一个,方法数:dp[i - 1][j]综上 dp[i][j] = d 阅读全文

posted @ 2011-02-23 10:06 宇宙吾心 阅读(265) 评论(0) 推荐(0)

导航