随笔分类 -  DP动态规划

摘要:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define N 10001 5 6 int f[N], value[3]; 7 int main() 8 { 9 int i, j, V, ncases;10 11 scanf("%d", &ncases); 12 while( ncases-- )13 { 14 scanf("%d",&V); 15 value[0] = 150;16 ... 阅读全文
posted @ 2012-08-21 09:42 zhongya 阅读(124) 评论(0) 推荐(0)
摘要:比赛时看着题的太长了,加上又全是英文(英语不太好T_T.....)题意没理解,就放弃了,后来听说是求他的最长上升子序列,我勒个去啊!一个简单的DP搞这么麻烦的题目。。。。要用O(n*logn)方法过。。。。View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define N 40005 5 6 int stack[N]; 7 int main() 8 { 9 int i,temp,ncases;10 int top,n,low,mid,high; 11 12 . 阅读全文
posted @ 2012-08-16 11:04 zhongya 阅读(168) 评论(0) 推荐(0)
摘要:刚开始用的多重背包写的结果果然超时,后来用别人告诉我的把它用二进制压缩一下,这里附上资料:解题思路:题目给价值为1~6的六种大理石的个数若干,要求我们判断是否能够把石头平分成相等的价值。我的思路是这样的:将大理石的重量看成和价值相等,那么总容量等于总价值数sum,那么如果总容量为sum/2时能装的最大价值也为sum/2,那么说明能拆分也两份相等的价值。注意:此题用背包要压缩,否则会超时。背包九讲的第三讲中提到了压缩方法,我贴出来:P03:多重背包问题每种物品有一个固定的次数上限题目有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品 阅读全文
posted @ 2012-08-15 15:26 zhongya 阅读(276) 评论(0) 推荐(0)
摘要:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int main() 6 { 7 int i,j,k,ncases,n,m,num[110]; 8 int value[110],weight[110],f[110]; 9 10 scanf("%d",&ncases);11 while( ncases-- )12 {13 scanf("%d%d",&n,&m); 14 for(i=1; i< 阅读全文
posted @ 2012-08-13 17:20 zhongya 阅读(127) 评论(0) 推荐(0)
摘要:简化的动态规划方程:for i=1..N for v=0..V f[v]=max{f[v],f[v-c[i]]+w[i]}View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define m 200000000 5 6 int main() 7 { 8 int i,j,v,ncases,f[10005]; 9 int empty,full,V,N,P[505],W[505];10 11 scanf("%d",&ncases);12 w 阅读全文
posted @ 2012-08-13 17:19 zhongya 阅读(123) 评论(0) 推荐(0)
摘要:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int main() 6 { 7 int i,j,N,V,v,ncases; 8 int f[1005],c[1005],w[1005]; 9 10 scanf("%d",&ncases);11 12 while( ncases-- )13 {14 scanf("%d%d",&N,&V);15 for(i=1; i<=N; i++)16 s 阅读全文
posted @ 2012-08-13 17:17 zhongya 阅读(137) 评论(0) 推荐(0)
摘要:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int c[10001],w[10001],f[10001]; 6 int main() 7 { 8 int i, j, n, v; 9 10 while(scanf("%d%d",&n,&v)&&n&&v)11 {12 memset(f,0,sizeof(f)); 13 for(i=0; i<n; i++)14 ... 阅读全文
posted @ 2012-03-30 22:41 zhongya 阅读(143) 评论(0) 推荐(0)
摘要:看了两个多小时的01背包问题,这是做出来的第一道,Happy~!提议可以这样来理解,要求邮票的分值之差最小,就是邮票分成两堆即两个容器,而每张邮票只有选和不选两种状态,所以只要求出每个容器的最大装载量即可,这样就转化为01背包问题了。这和zb的生日那道题一样只要代码稍作休改就能过。score[j]代表的是容量为j的容器所能装载邮票的最大分值。得出递推关系式:score[j] = score[j] > score[j-a[i]]+a[i] ? score[j] : score[j-a[i]]+a[i];其中a[i]是第i个邮票的分值View Code 1 #include<stdio 阅读全文
posted @ 2012-03-30 22:10 zhongya 阅读(525) 评论(0) 推荐(0)
摘要:此题是数字三角形的变形,有些细节要注意,当KK走倒最后一列是只能向下走,当KK走到最后一行时,只能向右走;这两种情况要单独考虑。d[i][j]指在i,j这个位置走到右下角所能吃的虫子数目。View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int main() 6 { 7 int i,j,N,M; 8 int a[25][25],d[25][25]; 9 10 scanf("%d%d",&N,&M);11 for(i=1; 阅读全文
posted @ 2012-03-29 14:58 zhongya 阅读(283) 评论(0) 推荐(0)
摘要:题目意思很简单了,输入一个行数和列数相同的矩阵a[n][n]然后求最大的子矩阵和。它实际上就是最大子段和的二维推广,可以按照一维的思路来做。首先将每一列的和压缩成一个b[j]数组的元素,它代表a[i1][j]+a[i1+1][j]+......+a[i2][j]的和,这是保持列数不变再把它压缩成一个元素,这样进行压缩后实际上就是求b[1].....b[j]..b[n]的最大子段和,这就转化为一维的情况。View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define N 101 5 int a[N][N]; 6 阅读全文
posted @ 2012-03-28 16:48 zhongya 阅读(277) 评论(0) 推荐(0)
摘要:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main() 5 { 6 int i, j, ncases, n; 7 int a,b,sum; 8 scanf("%d",&ncases); 9 while( ncases-- )10 {11 b=-1, sum = -9999; //其中的值会有负数,所以b,sum要先设负值12 scanf("%d",&n); 13 for(i=1; i<=n; i++)14 ... 阅读全文
posted @ 2012-03-23 22:52 zhongya 阅读(176) 评论(0) 推荐(0)
摘要:View Code 1 不要把它当做一般的水题看,尽管算法比较简单属于 2 入门的DP可是测试数据真的很坑爹!一开始写了个函 3 数将start,end,a[],设为全局变量可还是过不了,最后 4 我把函数全写在了主函数内了,全部改成局部变量,最后过了! 5 #include<stdio.h> 6 #include<stdlib.h> 7 8 int main() 9 {10 int i, ncases, n, j,sum,b,k;11 int a[100001],start,end;12 13 scanf("%d",&ncases);14 阅读全文
posted @ 2012-03-23 19:36 zhongya 阅读(175) 评论(0) 推荐(0)
摘要:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define MAX 1000 5 6 int c[MAX][MAX],len1,len2; 7 char x[MAX],y[MAX]; 8 void LCSLength(int m,int n,char *x,char *y) 9 {10 int i,j;11 for(i=0; i<m; i++) 12 c[i][0] = 0; 13 for(i=0; i<n; i++)14 c[0][i] = 阅读全文
posted @ 2012-03-21 21:41 zhongya 阅读(216) 评论(0) 推荐(1)