2011年5月6日

0-1背包 和 完全背包

摘要:0-1背包状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。优化空间复杂度后得到:for i=1..N for v=V..0 f[ 阅读全文

posted @ 2011-05-06 18:54 _Clarence 阅读(114) 评论(0) 推荐(0) 编辑

ACM PKU 2531 Network Saboteur http://acm.pku.edu.cn/JudgeOnline/problem?id=2531

摘要:先找出在一个集合中的所有点再根据标记来求最大值!做了这么久,也实属无奈!!!#include <iostream>using namespace std;int Case;int num[21][21];bool flag[21];int Max = 0;int solve(int dp,int st){ int i, j, k;if (dp==0){ int sum=0; for (j = 0;j < Case; j++) { if (flag[j] == 1) { for (k = 0;k < Case; k++) { if (flag[k] != 1) sum + 阅读全文

posted @ 2011-05-06 18:53 _Clarence 阅读(75) 评论(0) 推荐(0) 编辑

ACM PKU 2636 Sudoku http://acm.pku.edu.cn/JudgeOnline/problem?id=2676

摘要:数独问题:搜索时,注意下标;#include <iostream>using namespace std;int num[11][11];int Case;void input(){ memset(num,0,sizeof(num)); int i,j; for (i = 0;i <9; i++) for (j = 0;j < 9; j++) { char a; cin >> a; num[i][j] = a - '0'; }}void output(){ int i,j; for (i = 0;i < 9; i++) { for (j 阅读全文

posted @ 2011-05-06 18:52 _Clarence 阅读(83) 评论(0) 推荐(0) 编辑

ACM PKU 3291 Cousins http://acm.pku.edu.cn/JudgeOnline/problem?id=3291

摘要:DP + 贪心 搞定 :#include <iostream>using namespace std;char in_st[101], in_ed[101];int len[101][101];int shortest(int n,int m){ int i , j; for (i = 0;i<=n;i++) len[i][0] = 0; for (i = 0;i<=m;i++) len[0][i] = 0; for(i = 1; i <=n; i++) { for (j = 1; j <=m ;j++) { if (in_st[i - 1] == in_e 阅读全文

posted @ 2011-05-06 18:49 _Clarence 阅读(80) 评论(0) 推荐(0) 编辑

ACM PKU 1164 The Castle http://acm.pku.edu.cn/JudgeOnline/problem?id=1164

摘要:建图比较难!建议开结构体数组!#include <iostream>#include<queue>using namespace std;int val[4] = {8,4,2,1};bool flag[4];struct room{ int m; int c; bool e;bool w; bool s;bool n;// room(){}; /*room(int a ,int b, bool x,bool y,bool z,bool t) { m = a; c = b; e = x; w = y; s = z; n = t; }*/};room num[50][50 阅读全文

posted @ 2011-05-06 18:48 _Clarence 阅读(57) 评论(0) 推荐(0) 编辑

ACM PKU 1111 Image Perimeters http://acm.pku.edu.cn/JudgeOnline/problem?id=1111

摘要:广搜永远记住,下标不要错,COPY时一定要记得改下标:#include <iostream>#include <queue>using namespace std;char rec[21][21];bool flag[21][21];int h[8] = {1,1,1,0,0,-1,-1,-1}; int s[8] = {1,-1,0,-1,1,0,-1,1};int row,column,st0,st1;int sum = 0;struct node{ int r; int c; node(){}; node(int x , int y) { r = x ; c = 阅读全文

posted @ 2011-05-06 18:48 _Clarence 阅读(121) 评论(0) 推荐(0) 编辑

ACM PKU 3176 Cow Bowling http://acm.pku.edu.cn/JudgeOnline/problem?id=3176

摘要:他奶奶的,我也做水题(DP水题)了,有必要鄙视一下:#include <iostream>using namespace std;int num [351][351];int sign[351];int Max = 0;int N;void solve (){ int i, j; for(i = N-1; i > 0; i--) for (j = 1; j <= i; j++) { if (sign[j] + num[i][j] > sign[j+1] + num[i][j] ) sign[j] += num[i][j]; else sign[j] = sign[ 阅读全文

posted @ 2011-05-06 18:46 _Clarence 阅读(57) 评论(0) 推荐(0) 编辑

ACM PKU 1191 棋盘分割 http://acm.pku.edu.cn/JudgeOnline/problem?id=1191

摘要:棋盘分割可以说是DP问题的经典,在刘汝佳老师的《算法艺术与信息学竞赛》上给出的一道例题,分析公式,要使最后的西格玛最小只要使每个方格的分数的平方和最小就行了,因为平均值使一个定值; 思路:1,先化简均方差公式,可以看出,只需要让每个分割后的矩形的总分的平方和尽量小,即可使均方差最小。2,考虑左上角坐标为(x1,y1),右下角坐标为(x2,y2)的棋盘,设它的总和为value[x1,y1,x2,y2]切割k次以后得到k+1块矩形的总分平方和最小值为store[k,x1,y1,x2,y2],则它可以沿着横线切,也可以沿着竖线切,然后选一块继续切(递归)。。3,由1,2部可以得到状态转移方程:st. 阅读全文

posted @ 2011-05-06 18:46 _Clarence 阅读(107) 评论(0) 推荐(0) 编辑

ACM PKU 1141 Brackets Sequence http://acm.pku.edu.cn/JudgeOnline/problem?id=1141

摘要:这家伙磨了我几天了,解题报告稍后上:#include <iostream>#include <string>using namespace std;const int Max = 999999;int flag[202][202],sign[202][202];char str[202];inline int min (int a,int b){return a > b ? b : a ;}int Find_Match(int len){memset(flag,0,sizeof(flag));int i, j, k, m;for (i = len; i > 阅读全文

posted @ 2011-05-06 18:44 _Clarence 阅读(82) 评论(0) 推荐(0) 编辑

ACM PKU 1276 Cash Machine http://acm.pku.edu.cn/JudgeOnline/problem?id=1276

摘要:大家都过了,我也来凑热闹了!最简单的01背包(也可以说是完全背包)!我将它01化了,很简单;代码在下面,有什么不懂的可以来问我!欢迎大家提问:#include <iostream>using namespace std;int flag[1100000];int sign[1100000];inline int max(int a, int b){ return a > b ? a : b ; }int Dp (int cash, int index){ int i, j; memset(sign,0,sizeof(sign)); for (i = 0; i <= in 阅读全文

posted @ 2011-05-06 18:44 _Clarence 阅读(94) 评论(0) 推荐(0) 编辑

导航

统计