随笔分类 -  动态规划

摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int n;int a[11][100100];int maxt;int d[11][100010];//d[i][j]表示在i地点j时间已经获得的最大值bool in(int x){ return x>=0&&x<=10;}int main(){ while(scanf("%d&qu 阅读全文
posted @ 2012-08-12 21:56 willzhang 阅读(130) 评论(0) 推荐(0)
摘要:这题假设所有的价值加起来为sum那么我们假设一个sum/2的背包用这个背包装物品,于是,这就转化成了一个多重背包问题= =我只会用二进制分解算多重背包以下是代码#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int n;int val[5000];int size;int d[300000];int main(){ int N; while(scanf("%d 阅读全文
posted @ 2012-08-12 15:45 willzhang 阅读(141) 评论(0) 推荐(0)
摘要:类似于求最大子序列的和#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int n;struct T{ int a; int b; int h;}block[100];int d[100];bool cmp(T x,T y){ return x.a*x.b>y.a*y.b;}bool check(int x,int y)//y能放到x上{ if(block[y].a 阅读全文
posted @ 2012-08-12 12:28 willzhang 阅读(129) 评论(0) 推荐(0)
摘要:每组测试数据的第一行是两个整数n,m,分别表示行数和列数(1<=n<=20,10<=m<=1000);悔不该看错题,WA了无数遍把m,n的范围看反了。。。。狂WA= =#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;__int64 m,n;__int64 a[22][1010];__int64 d[22][1010];int main(){ __ 阅读全文
posted @ 2012-08-10 22:01 willzhang 阅读(229) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int n;long a[1010];long d[1010];//int main(){ while(scanf("%d",&n),n) { int i,j; for(i=0;i<n;i++) { scanf("%ld",&a[i]); d[i]=a[i]; 阅读全文
posted @ 2012-08-10 18:49 willzhang 阅读(126) 评论(0) 推荐(0)
摘要:一开始狂WA,后来随机了100个数据全过,无语了。。。后来把ch改成ch[10]过了。。。这题的数据太黑了= =必须得用%s过滤#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int m,n;int d[1010][1010];int left[1010];int right[1010];int main(){ int total; scanf("%d&quo 阅读全文
posted @ 2012-08-10 15:34 willzhang 阅读(259) 评论(0) 推荐(0)
摘要:对每个数用动态规划找到最左边的大于等于它的数,找到最右边的大于等于它的数,最后做一次循环得到答案代码如下#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;__int64 a[100010];__int64 n;struct T{ __int64 left; __int64 right; __int64 height;}d[100010];int main(){ while 阅读全文
posted @ 2012-08-10 10:26 willzhang 阅读(177) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int a[10010];struct T{ int sum; int head;}d[10010];int main(){ int n; while(scanf("%d",&n),n) { int head=-1; int i; bool flag=false; for(i=0;i<n; 阅读全文
posted @ 2012-08-09 22:10 willzhang 阅读(178) 评论(0) 推荐(0)
摘要:DP真心难。。。。不过这题还是比较简单的,状态转移为d[j]=d[j]>d[j-value[i-1]]*probi[i-1]?d[j]:d[j-value[i-1]]*probi[i-1];d[j]表示抢到j元的时候不被抓的最大概率#include<stdio.h>#include<stdlib.h>#include<math.h>#include<algorithm>#include<string.h>using namespace std;int sum;//能获得的最大值double Floor;int value[110 阅读全文
posted @ 2012-08-09 20:50 willzhang 阅读(219) 评论(0) 推荐(0)
摘要:完全背包问题,并且要求恰好装满背包且求的是最小值#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>#define MAX 9999999999using namespace std;int sumweight;//int weight[550];int value[550];int N;//硬币种类数目__int64 d[10010];int main(){ int total; scanf("%d& 阅读全文
posted @ 2012-08-09 09:47 willzhang 阅读(157) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int N,M;int cost[3500];int desire[3500];int d[2][13000];//d[i][j]表示将前i件物品放入容量为j的背包的最大值int main(){ while(scanf("%d %d",&N,&M)!=EOF) { int i,j; fo 阅读全文
posted @ 2012-08-08 21:11 willzhang 阅读(626) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int n;int a[110][110];int h[110][110];int f[110];int mmax;int d[110];//d[i]为以i结尾的f段的最大值void dp(){ int i; d[0]=f[0]; if(mmax<d[0]) { mmax=d[0]; } for(i=1;i<n 阅读全文
posted @ 2012-08-08 11:22 willzhang 阅读(244) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int m,n;//m行n列int h[110][110];int d[110][110];int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};bool in(int x,int y){ if(x>=0&&x<m&&y>=0&& 阅读全文
posted @ 2012-08-08 09:26 willzhang 阅读(195) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int n,m;#define MIN -65530int a[110][110];int d[110][110];//到达此点之后还能获得的最大值void dp(int i,int j){ int jj; for(jj=j+1;jj<=m-n+i+1;jj++) { if(d[i+1][jj]==MIN) { d. 阅读全文
posted @ 2012-08-07 22:03 willzhang 阅读(188) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int n;int a[40010];int d[40010];int b[40010];int dmax;int main(){ int total; scanf("%d",&total); int i; while(total--) { scanf("%d",&n 阅读全文
posted @ 2012-08-07 20:38 willzhang 阅读(119) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#include<algorithm>using namespace std;int a[5002];int d[5002];int n;int main(){ while(scanf("%d",&n)!=EOF) { int i; for(i=0;i<n;i++) { scanf("%d",&a[i]); } int k=n; //.. 阅读全文
posted @ 2012-08-07 09:50 willzhang 阅读(140) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#include<algorithm>using namespace std;int a[5002];int d[5002];int main(){ int cases=1; while(scanf("%d",&a[0]),a[0]+1) { int k=1; while(scanf("%d",&a[k]),a[k]+1) { k++; } / 阅读全文
posted @ 2012-08-07 09:40 willzhang 阅读(152) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int num1;int num2;char str1[1010];char str2[1010];int d[1010][1010];void init(){ int i,j; for(i=0;i<=num1;i++) { for(j=0;j<=num2;j++) { d[i][j]=-1; } ... 阅读全文
posted @ 2012-08-06 23:05 willzhang 阅读(134) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;char str1[210];int num1;char str2[210];int num2;char ans[500];int num;bool d[210][210];int main(){ int np=1; int i,j; int n; scanf("%d",&n); getchar 阅读全文
posted @ 2012-08-06 20:36 willzhang 阅读(154) 评论(0) 推荐(0)
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;char str1[110];char str2[110];int num1;int num2;int d[110][110];#define MAX -65530void init(){ int i,j; for(i=0;i<=num1;i++) { for(j=0;j<=num2;j++) { d[i][j 阅读全文
posted @ 2012-08-06 19:04 willzhang 阅读(126) 评论(0) 推荐(0)