
DP
文章平均质量分 61
Matrix1254
爱代码,爱加班,爱咖啡可乐
爱挑战,爱钻研,爱打游戏
爱晚起,也爱工作到深夜。
我擅长技术,崇尚简单和懒惰
我神秘而孤僻,沉默而爱憎分明
我行我素,我是程序员
展开
-
hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
多重背包问题,用0-1背包来做。稍后看完《背包问题九讲》后再来做。 #include#define NUM 105int v[NUM],w[NUM],num[NUM],dp[NUM];int main(){ int cases,n,m,i,j,k; //freopen("C:\\Documents and Settings\\Administrator\\桌面\原创 2013-01-04 18:34:32 · 426 阅读 · 0 评论 -
hdu 1114 Piggy-Bank
一句话,完全背包问题。状态转移方程:if(dp[j-w[i]]+p[i] dp[j]=dp[j-w[i]]+p[i];#include#define MAX_NUM 10000000#define NUM 10005int dp[NUM],p[NUM],w[NUM];int main(){ int cases,e,f,n; int i,j,v;原创 2013-01-04 17:42:35 · 419 阅读 · 0 评论 -
hdu 1160 FatMouse's Speed
解题思路:按某一维排序,则二维简化为一维。先按体重从小到大排序,再按速度从大到小排序,找出速度最长递减子序列。建一个结构体:struct mouse,其中weight,speed是体重和速度,num是其输入的顺序,pre是记录路径上的前一点的下标。状态转移方程为:dp[i]=dp[j]+1; 如果 mice[i].speedmice[j].weight ,并且dp[j]+1>dp[i]。 max{原创 2012-12-13 23:28:56 · 435 阅读 · 0 评论 -
hdu 1176 免费馅饼
刚开始思路不清,输入不明,WA了几次。静下心来分析,得出状态转移方程就好了。果然做题时要认真啊~~~解题思路:这题是一道典型的DP,类似于hdu2084数塔的变形,时间和位置分别作为矩阵的列和行,自顶向下考虑,自底向上计算,状态转移方程f[i][j]+= max(m[i+1][j-1],m[i+1][j],m[i+1][j+1]),为了能存放最优解的值,则列位置向右偏移一个单位,即m[0]原创 2012-12-10 23:09:19 · 577 阅读 · 0 评论 -
hdu 1008 Common Subsequence
按题意,求两个字符串的最长公共子序列。用a[m ], b[n]保存两个字符串,c[k]为它们的公共子序列。用f[i][j] 表示a[i], b[j] 两个字符串的公共子序列的最大长度,如果a[i]=b[j]=c[k],即a串b串的最后一个字符相同,则f[i][j] = f[i-1][j-1] + 1; 如果a[i]!=b[j], a[i] != c[k] 或者a[i]!=b[j], b[j]!=c原创 2012-12-14 17:46:36 · 462 阅读 · 0 评论 -
hdu 一个人的旅行
dp#include#define INT_MAX 0xffffff#define NUM 1005int map[NUM][NUM];int dist[NUM],linkarr[NUM], wantarr[NUM];int visited[NUM];int n,m;void dijkstra(int v){ int i,j,k; for(i=1原创 2012-12-15 16:18:33 · 501 阅读 · 0 评论 -
需要重点回顾:hdu 1421 搬寝室
值得注意的DP,可以证明:这个题目的最优解是2k个数按从大到小排序,一个数只有和相邻的数结合,才能使得差平方的和最小。因为n个数中取k对,一个数既可以和前一个数结合,又可以和后一个数结合,思维极其混乱。不知如何解。后参考网上解题报告得出:a[i]可以算成一个数与相邻的后一个数的差的平方,即,这样就转化为一维的。dp[n][k]定义为从n个数取k对的差平方的最小和,如果最后一个数是2k中的,则它必是原创 2012-12-12 20:00:19 · 467 阅读 · 0 评论 -
hdu 经典数塔问题
经典的DP问题,要保存中间状态,不然会超时。。。AC代码:#includeint a[105][105],f[105][105];inline int max(int x,int y) { return x<y?y:x;}/*int f(int i,int j){ if(i==n) return a[i][j]; else return a[i][j]+max(原创 2012-12-09 00:15:02 · 544 阅读 · 0 评论 -
hdu 2602 Bone Collector
经典的0-1背包问题,发现自己的一个毛病,不够细心。我原本觉得用简单的dp可以做,即dp[i][j]表示前i个物品,背包容量为j的最大值。状态转移方程为:if(j>=w[i]) dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])。其实没有考虑到j=w[i]&&dp[i-1][j-w[i]]+v[i]>dp[i-1][j]) dp[i][j]=dp[i-1]原创 2013-01-02 22:34:42 · 435 阅读 · 0 评论 -
hdu 1874 畅通工程续
dp #include#define INT_MAX 0xffffff#define NUM 205int map[NUM][NUM];int dist[NUM];int visited[NUM];int n,m;void dijkstra(int v){ int i,j,k; for(i=0;i<n;i++) { if(map[v][i]原创 2012-12-15 00:33:16 · 470 阅读 · 0 评论 -
hdu 1058 Humble Numbers
算法分析:典型的DP!1 ->?1 ->2=min(1*2,1*3,1*5,1*7)1 ->2 ->3=min(2*2,1*3,1*5,1*7)1 ->2 ->3 -> 4 = min(2*2,2*3,1*5,1*7)1 ->2 ->3 -> 4 ->5= min(3*2,2*3,1*5,1*7)状态转移方程F(n)=min(F(i)*2,F(j)*3,F(k)*5原创 2012-12-13 11:00:56 · 381 阅读 · 0 评论 -
hdu 1087 Super Jumping! Jumping! Jumping!
这题也是DP,实质就是求最大递增子序列的和。用dp[i]表示从第1个元素到第i个元素的最大递增子序列的和,仔细分析可得出状态转移方程:dp[i]=max{ dp[j]+a[i] }, if(a[i] > a[j] ),其中 j AC代码: #includeint main(){ int n,i,j,max_num; int a[1005],dp[1005]; whi原创 2012-12-10 23:58:47 · 383 阅读 · 0 评论 -
pat 1045 Favorite Color Stripe
比较简单的dp题。假设dp[s]为s长度的字串的最大值。则状态转移方程为:dp[s]=dp[r]+1 ( seq[s]>seq[r]&& dp[r]+1>dp[s] )。就判断最后一个字母要不要加入即可。AC代码:#include#define N 200#define M 10000using namespace std;int main(void){ int原创 2013-03-09 10:16:48 · 1434 阅读 · 0 评论