上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 36 下一页

2011年5月2日

poj 1973

摘要: dp[i][x]表示前i个工人,做x件A,最多能做多少件B。(空间可以优化成一维,但要注意for循环顺序,从大到小,向01背包那样!)因为时间是通过二分枚举确定下来了。所以有转移方程:mid是枚举处的时间dp[j]=max(dp[j],dp[j-k]+(mid-k*a[i])/b[i]);代码:#include<iostream>#include<fstream>using namespace std;int n,m,mid;int a[101],b[101];int dp[101][101];int solve(){ int i,j,k; memset(dp,-1,s 阅读全文

posted @ 2011-05-02 15:17 宇宙吾心 阅读(285) 评论(0) 推荐(0)

poj 2127

摘要: 题目要求出最长公共上升子序列,我们知道,求最长公共子序列的算法是O(n^2)的,求最长上升子序列是O(n*(logn))的。所以这两个问题合在一起,复杂度不会低于O(n*logn)由于数据给到500,所以O(n^3) 的算法是可以过的。定义max[i][j]为A串匹配到i,B串匹配到j时的最长公共上升子序列的长度。若A[i]!=B[j] 那么max[i][j]=MAX{max[i'][j']|i'<i,j'<j}若A[i]==B[j] 那么max[i][j]=MAX{max[i'][j']+1|i'<i,j'&l 阅读全文

posted @ 2011-05-02 14:41 宇宙吾心 阅读(692) 评论(0) 推荐(0)

2011年5月1日

poj 2181

摘要: 题意:最大子序列,奇数项加,偶数项减。dp解代码:#include<iostream>#include<fstream>using namespace std;int dp[150001][2][2];int n;int a[150001];void read(){// ifstream cin("in.txt"); int i,j,k; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; dp[1][0][0]=0; dp[1][0][1]=-9999999; dp[1][1][1]=a[1]; 阅读全文

posted @ 2011-05-01 16:52 宇宙吾心 阅读(393) 评论(0) 推荐(0)

poj 2353

摘要: 题目的大意就是给了M*N的矩阵,求一条从第一行到最后一行的路径(只能从上往下走),使得路径上的数字总和最小,输出该路径,如有多条,则任意输出一条。路径的表达方式可参考样例。f[i][j]=Min{f[i][j],f[i][j+1]+a[i][j],f[i][j-1]+a[i][j]}这个初看不是很好写,f[i][j]与f[i][j+1]和f[i][j-1]都有关,其实只要循环两次,即第一次从左到右,每次f[i][j]只与f[i][j-1]比较,第二次从右到左,每次f[i][j]只与f[i][j+1]比较,就可以了。代码:#include<iostream>#include<f 阅读全文

posted @ 2011-05-01 15:33 宇宙吾心 阅读(513) 评论(0) 推荐(0)

poj 2392

摘要: 题意:有一群牛要上太空,他们计划建一个太空梯(用一些石头垒),他们有k种不同类型的石头,每一种石头的高度为h,数量为c,由于会受到太空辐射,每一种石头不能超过这种石头的最大建造高度a,求解利用这些石头所能修建的太空梯的最高的高度.多重背包dp染色法。代码:#include<iostream>#include<fstream>using namespace std;struct e{ int h,a,c;};e map[401];int dp[40001];int c[40001];int cmp(const void *a,const void *b){ e *s=(e 阅读全文

posted @ 2011-05-01 14:23 宇宙吾心 阅读(617) 评论(0) 推荐(1)

2011年4月30日

poj 3018

摘要: dp升序代码:#include<iostream>#include<fstream>using namespace std;int n,m;struct e{ int a[1001];};e map[501];int gif[1001];int cmp(const void *a,const void *b){ return *(int*)a-*(int*)b;}int cmp1(const void *a,const void *b){ e *s=(e*)a; e *t=(e*)b; int i=0; while(i<m) { if(s->a[i]!=t- 阅读全文

posted @ 2011-04-30 18:48 宇宙吾心 阅读(231) 评论(0) 推荐(0)

poj 3036

摘要: 题意:黄蜂有多少种走法。它在六边形格子中走 n 步并且回到初始位置一共有多少种走法。代码:#include<iostream>#include<fstream>using namespace std;int res[15][30][30];void read(){// ifstream cin("in.txt"); int i,j,k; res[0][15][15]=1; for(k=0;k<14;k++) for(i=1;i<=29;i++) for(j=1;j<=29;j++) { if(j>2) res[k+1][i][ 阅读全文

posted @ 2011-04-30 16:43 宇宙吾心 阅读(449) 评论(0) 推荐(0)

poj 3176

摘要: 简单dp代码:#include<iostream>#include<fstream>using namespace std;int dp[351][351];int n;int a[351][351];void read(){// ifstream cin("in.txt"); int i,j,k; cin>>n; for(i=1;i<=n;i++) for(j=1;j<=i;j++) cin>>a[i][j]; dp[1][1]=a[1][1]; for(i=1;i<n;i++) for(j=1;j< 阅读全文

posted @ 2011-04-30 12:48 宇宙吾心 阅读(281) 评论(0) 推荐(0)

poj 3186

摘要: 简单dp代码:#include<iostream>#include<fstream>using namespace std;int a[2001];int dp[2001][2001];int n;void read(){// ifstream cin("in.txt"); int i,j,k; cin>>n; for(i=1;i<=n;i++) { cin>>j; a[i]=a[i-1]+j; } for(i=1;i<=n;i++) dp[i][i]=a[i]-a[i-1]; for(k=1;k<=n-1; 阅读全文

posted @ 2011-04-30 12:38 宇宙吾心 阅读(305) 评论(0) 推荐(0)

poj 3616

摘要: 简单dp。代码:#include<iostream>#include<fstream>using namespace std;int n,m,r;struct e{ int s,t,f;};e a[1001];int cmp(const void *a,const void *b){ return (*(e *)a).s-(*(e *)b).s;}int dp[1001];void read(){// ifstream cin("in.txt"); int i,j,k; cin>>n>>m>>r; n=m; for 阅读全文

posted @ 2011-04-30 12:15 宇宙吾心 阅读(386) 评论(0) 推荐(0)

上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 36 下一页

导航