随笔分类 -  dp

摘要:Capturing a country Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 380Accepted Submission(s): 164Problem DescriptionAnt and Bob two army want to capture a country. The country is consist of N cities. To capture the city i, it takes Ant A[i] minu. 阅读全文
posted @ 2012-08-08 22:01 Szz 阅读(306) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4248 题解: 给定n种颜色的石头,每种颜色有si颗,同种颜色的石头不区分。问能构成多少种不同的石头序列(不同的序列是指:1.石头数不同;2.石头数相同,至少一个位置的石头颜色不同) dp[ i ][ j ]表示:考虑前i种石头构成的长度为j的序列的个数。 转台转移方程: dp[ i ][ j ] = dp[ i-1 ][ j ]; //未放入第i种颜色的石头 for k := 1 ~ min( j , s[ i ] ) //放入k个第i种颜色的石头 dp[ i ][ j ] ... 阅读全文
posted @ 2012-07-17 10:02 Szz 阅读(359) 评论(0) 推荐(0)
摘要:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=615 1 用dp[i][k]表示以k为最大值组成i需要多少种方法 2 那么答案ans=dp[i][50]+dp[i][25]+dp[i][10]+dp[i][5]+dp[i][1]; 3 用dfs()求dp[i][k]; 4 转移方程: 5 dp[i][k]=0 i<k||i<0 6 dp[i][k]= 求和dfs(i-k,x) 1<=x<=k; 7 8 9 阅读全文
posted @ 2012-06-23 11:02 Szz 阅读(162) 评论(0) 推荐(0)
摘要:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=18206 1 /* 2 题目大意: 3 从第一列的任意一格出发,到子最后一列的任意一格,的最短路。(一开是理解错了,以为是到第n行m列那个格子,知道样例没过,才发现) 4 每一格只能这样走 5 6 7 8 而且第一行向上可以走到最后一行, 9 最后一行向下是第一行 10 */ 11 dp[i][j]存储 第[i][j]到一列的最短路 12 状态转移方程为: 13 dp[i][j]=min(dp[i-1][j+1],dp[i]... 阅读全文
posted @ 2012-05-27 11:24 Szz 阅读(365) 评论(0) 推荐(0)
摘要:1 /* 2 lis变形 ,一开始没看出来,看了别人的解题报告才看出来 3 题意: 4 求相对位置,不变的最长序列 5 6 7 */ 8 9 #include<stdio.h>10 const int N=100;11 int a[N],dp[N],rank[N];12 int max(int x,int y)13 {14 if(x>y)return x;15 else return y;16 }17 int main()18 {19 int n,i,j,k;20 scanf("%d",&n);21 for(i=1;i<=n;i++)22.. 阅读全文
posted @ 2012-05-20 21:55 Szz 阅读(180) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1276#include<iostream>#include<stdio.h>#include<string.h>const int N=120005;using namespace std;int v,n,num[N],val[N],dp[N];void zeropack(int c){ for(int i=v;i>=c;i--) dp[i]=max(dp[i],dp[i-c]+c);}void completepack(int c){ for(int i=c;i<=v;i++) dp[i]= 阅读全文
posted @ 2012-03-24 09:10 Szz 阅读(144) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1837/*题意:有一个device(直杆),以中点为支点,左右长度都为15,上面在不同位置分布着一些挂钩。现在给出c个挂钩,和它们在杆上的位置(以中点的原点的x轴表示),以及Gigel有G个砝码,和它们各自的重量。求如果把这些钩码全部挂在任意钩上(一钩个挂任意多个),最终device能达到平衡的情况数。解题思路:01背包。首先这里有负数,所以用到了偏移变量temp(以他为平衡点),dp[i][j]表示i件东西,放上去达到j重量所需的方法数。因为最终要的是平衡状态 所以答案为:dp[g][temp]; 状态方程 :dp[i][k+val]+= 阅读全文
posted @ 2012-03-23 17:46 Szz 阅读(170) 评论(0) 推荐(0)
摘要:01背包 n代表物品种数,c[]代表花费,val[]代表价值 num[]代表 数量for(i=1;i<=n;i++){ for(j=v;j>=c[i];j--) dp[j]=max(dp[j],dp[j-c[i]]+val[i]);}多重背包 for(i=1;i<=m;i++) { for(j=1;j<=num[i];j++) { for(k=n;k>=w[i];k--) dp[k]=max(dp[k],dp[k-w[i]]+val[i]); ... 阅读全文
posted @ 2012-03-21 17:44 Szz 阅读(168) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2191#include<stdio.h>#include<iostream>#include<string.h>using namespace std;const int N=1000;int w[N],val[N],dp[N],num[N];int main(){ int c,n,m,i,j,k; scanf("%d",&c); while(c--) { scanf("%d%d",&n,&m); for(i= 阅读全文
posted @ 2012-03-21 17:26 Szz 阅读(237) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1114#include<stdio.h>#include<iostream>using namespace std;const int N=15000;#define inf 999999int val[N],c[N],dp[N];int main(){ int t,e,f,i,j,n; scanf("%d",&t); while(t--) { scanf("%d%d",&e,&f); int v=f-e; scanf(& 阅读全文
posted @ 2012-03-21 16:49 Szz 阅读(146) 评论(0) 推荐(0)
摘要:背包九讲 http://love-oriented.com/pack/初始化的细节问题我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背 阅读全文
posted @ 2012-03-21 09:30 Szz 阅读(262) 评论(0) 推荐(1)