2011年5月2日

poj 1732

摘要: dp代码:#include<iostream>#include<fstream>using namespace std;int dp[101];char c[110];char hash[30]="22233344115566070778889990";int road[101];int n;char a[50001][51];char b[50001][51];void print(int s){ if(s!=0) { print(s-strlen(a[road[s]])); cout<<b[road[s]]<<' 阅读全文

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

poj 1837

摘要: 题意:现在有一个天平,还有C个挂钩和G个砝码,求解又多少种方法能使得天平平衡(注意必须使用所有的砝码) dp[i][j]表示在挂上前i个物体的时,平衡度为j(j>0时表示左边重,j=0时表示天平平衡,j<0时表示右边重)时挂法的数量,而根据题意可以确定j的取值范围为:[-7500,7500],于是可以得到状态转移方程为: dp[i][j]+=(dp[i-1][j-p[k]*g[i]]), p[k]表示第k个挂钩的位置,g[i]为第i个砝码的重量 由于j-p[k]*g[i]可能为负数,因此统一加上7500,那么初始状态dp[0][7500]=1(此时表示天平平衡),表示不用物体且使得 阅读全文

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

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)

导航