从最简单的开始:

POJ:The Triangle

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int dp[][];
int a[][];
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
for(int j=;j<=i;j++)
{
scanf("%d",&a[i][j]);
}
}
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++) dp[n][i] = a[n][i];
for(int i=n-;i>=;i--)
{
for(int j=;j<=i;j++)
{
dp[i][j] = max(dp[i+][j],dp[i+][j+])+a[i][j];
}
}
printf("%d\n",dp[][]);
}

卷珠帘

HDU:1159最长公共子序列

一维的转来转去,卡死了,结果换成二维的,轻松解决。清晰的体现了转移的特性。

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = ;
int dp[maxn][maxn];
char s1[maxn];
char s2[maxn];
int main()
{
while(scanf("%s %s",s1+,s2+)!=EOF)
{
int n = strlen(s1+);
int m = strlen(s2+);
int maxx = ;
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(s1[i]==s2[j])
{
dp[i][j] = dp[i-][j-]+;
}
else
{
dp[i][j] = max(dp[i-][j],dp[i][j-]); //两方程突出了转移
}
}
}
printf("%d\n",dp[n][m]);
}
}
/*
127486 214786
*/

卷珠帘

HDU:1069最长上升子序列

思路清晰^_^

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = ;
int dp[maxn];
struct edge
{
int l,r,h;
};
edge e[maxn];
bool cmp(edge A,edge B)
{
if(A.l!=B.l) return A.l>B.l;
if(A.r!=B.r) return A.r>B.r;
if(A.h!=B.h) return A.h>B.h;
}
int main()
{
int n,kase = ;
while(scanf("%d",&n)!=EOF&&n)
{
int x,y,z;
for(int i=;i<=*n;i+=)
{
scanf("%d %d %d",&x,&y,&z);
e[i].l = e[i+].r = e[i+].h = x;
e[i].r = e[i+].h = e[i+].l = y;
e[i].h = e[i+].l = e[i+].r = z;
if(e[i].l<e[i].r) swap(e[i].l,e[i].r);
if(e[i+].l<e[i+].r) swap(e[i+].l,e[i+].r);
if(e[i+].l<e[i+].r) swap(e[i+].l,e[i+].r);
}
sort(e+,e+*n+,cmp);
memset(dp,,sizeof(dp));
int maxx = ;
for(int i=;i<=*n;i++)
{
dp[i] = e[i].h;
for(int j=;j<i;j++)
{
if(e[i].l<e[j].l&&e[i].r<e[j].r)
{
dp[i] = max(dp[i],dp[j]+e[i].h);
}
}
maxx = max(maxx,dp[i]);
}
printf("Case %d: maximum height = %d\n",++kase,maxx);
}
}
/*
127486 214786
*/

卷珠帘

UVa:103 Stacking Box

n维的的最长上升子序列,不过需要打印路径,一个pre记录下。

在每一个box内部排序时,我差点写10个变量,不过最后学的姿势。

每次最愁做UVa题,网速慢死了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = ;
int n,m;
int pre[maxn];
int dp[maxn];
vector<int> cnt;
struct node
{
int sq,edge[];
};
node box[maxn];
bool cmp(node A,node B)
{
for(int i=;i<=m;i++)
if(A.edge[i]!=B.edge[i]) return A.edge[i]>B.edge[i];
return A.edge[m]>B.edge[m];//以防全相等
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=;i<=n;i++)
{
box[i].sq = i;
for(int j=;j<=m;j++)
{
scanf("%d",&box[i].edge[j]);
}
sort(box[i].edge+,box[i].edge+m+);
} sort(box+,box+n+,cmp);
memset(dp,,sizeof(dp));
memset(pre,,sizeof(pre));
int maxn = ;
int ans = ;
int flag = ;
for(int i=;i<=n;i++)
{
dp[i] = ;
for(int j=;j<i;j++)
{
flag = ;
for(int k=;k<=m;k++)
{
if(box[i].edge[k]>=box[j].edge[k])
{
flag = ;
break;
}
}
if(!flag)
{
if(dp[i]<dp[j]+)
{
dp[i] = dp[j]+;
pre[box[i].sq] = box[j].sq;
}
}
}
if(dp[i]>maxn)
{
maxn = dp[i];
ans = box[i].sq;
}
}
printf("%d\n",maxn);
cnt.clear();
while(pre[ans]!=)
{
cnt.push_back(ans);
ans = pre[ans];
}
cnt.push_back(ans);
for(int i=;i<cnt.size()-;i++)
{
printf("%d ",cnt[i]);
}
printf("%d\n",cnt[cnt.size()-]);
}
return ;
}
/*
5 1
2
1
4
2
4
*/

卷珠帘

修炼dp(1)的更多相关文章

  1. 修炼dp( 2 )

    P1084 数字三角形4 题解:dp+dfs. #include <iostream> #include <cstdio> #include <algorithm> ...

  2. hdoj 2059 :龟兔赛跑 (DP)[转]

      转的别人的找了很多就这个比较好理解.   Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下 ...

  3. 杭电2059(dp)

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 【巧妙消维DP】【HDU2059】龟兔赛跑

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. hdu 2059 龟兔赛跑(dp)

    龟兔赛跑 Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成 ...

  6. 龟兔赛跑(DP)

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. 「NOI2013」小 Q 的修炼 解题报告

    「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...

  8. HDU 2059 龟兔赛跑(超级经典的线性DP,找合适的j,使得每个i的状态都是最好的)

    龟兔赛跑 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  9. hdu 2059:龟兔赛跑(动态规划 DP)

    龟兔赛跑 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

随机推荐

  1. linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(

    VIRT,RES,SHR,虚拟内存和物理内存(转) VIRT: 1.进程"需要的"虚拟内存大小,包括进程使用的库.代码.数据,以及malloc.new分配的堆空间和分配的栈空间等: ...

  2. CentOS中由一般用户切换为root用户

    --->http://www.centoscn.com/CentOS/help/2014/0624/3173.html 1.打开终端,提示符为“$”,表明该用户为普通用户,此时,直接输su,回车 ...

  3. oc知道经纬度求位置

    CLLocation *newLocation = [locations lastObject]; CLGeocodeCompletionHandler handler = ^(NSArray *pl ...

  4. bfs UESTC 381 Knight and Rook

    http://acm.uestc.edu.cn/#/problem/show/381 题目大意:给你两个棋子:车.马,再给你一个n*m的网格,从s出发到t,你可以选择车或者选择马开始走,图中有一些障碍 ...

  5. postfix防垃圾邮件

    Postfix 2.x 打开/etc/postfix/main.cf文件,在其中增加如下的几行(如果相关的配置存在,就替换之): vi /etc/postfix/main.cf [...] smtpd ...

  6. PhotoShop纸张大小

    1*标准打印纸 A4:210mm*297mm A3: 420mm*297mm 一张全开纸切成多少份 大度16开:210mm*285mm(度:切的意思) 大度8开:420*285mm 2*传统印刷纸 A ...

  7. MVC验证生成的代码

  8. 判断是ios还是android

    //判断是ios还是androidvar system;var ua = navigator.userAgent.toLowerCase(); if (/iphone|ipad|ipod/.test( ...

  9. 【Tomcat】Tomcat配置之请求字符串编码

    默认情况下,如果tomcat中部署的webservice或者web网站需要有中文的请求参数,而这时候我们直接在浏览器中输入中文那么接受到的将是乱码,无法达到我们的需求,这时候我们就需要对Tomcat的 ...

  10. css 重新学习系列(2)

    摘自: http://www.cnblogs.com/liuzhaoyang/articles/3289456.html Position定位:relative | absolute 定位一直是WEB ...