修炼dp(1)
从最简单的开始:
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[][]);
}
卷珠帘
一维的转来转去,卡死了,结果换成二维的,轻松解决。清晰的体现了转移的特性。
#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
*/
卷珠帘
思路清晰^_^
#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
*/
卷珠帘
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)的更多相关文章
- 修炼dp( 2 )
P1084 数字三角形4 题解:dp+dfs. #include <iostream> #include <cstdio> #include <algorithm> ...
- hdoj 2059 :龟兔赛跑 (DP)[转]
转的别人的找了很多就这个比较好理解. Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下 ...
- 杭电2059(dp)
龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 【巧妙消维DP】【HDU2059】龟兔赛跑
龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu 2059 龟兔赛跑(dp)
龟兔赛跑 Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成 ...
- 龟兔赛跑(DP)
龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 「NOI2013」小 Q 的修炼 解题报告
「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...
- HDU 2059 龟兔赛跑(超级经典的线性DP,找合适的j,使得每个i的状态都是最好的)
龟兔赛跑 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- hdu 2059:龟兔赛跑(动态规划 DP)
龟兔赛跑 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
随机推荐
- linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(
VIRT,RES,SHR,虚拟内存和物理内存(转) VIRT: 1.进程"需要的"虚拟内存大小,包括进程使用的库.代码.数据,以及malloc.new分配的堆空间和分配的栈空间等: ...
- CentOS中由一般用户切换为root用户
--->http://www.centoscn.com/CentOS/help/2014/0624/3173.html 1.打开终端,提示符为“$”,表明该用户为普通用户,此时,直接输su,回车 ...
- oc知道经纬度求位置
CLLocation *newLocation = [locations lastObject]; CLGeocodeCompletionHandler handler = ^(NSArray *pl ...
- bfs UESTC 381 Knight and Rook
http://acm.uestc.edu.cn/#/problem/show/381 题目大意:给你两个棋子:车.马,再给你一个n*m的网格,从s出发到t,你可以选择车或者选择马开始走,图中有一些障碍 ...
- postfix防垃圾邮件
Postfix 2.x 打开/etc/postfix/main.cf文件,在其中增加如下的几行(如果相关的配置存在,就替换之): vi /etc/postfix/main.cf [...] smtpd ...
- PhotoShop纸张大小
1*标准打印纸 A4:210mm*297mm A3: 420mm*297mm 一张全开纸切成多少份 大度16开:210mm*285mm(度:切的意思) 大度8开:420*285mm 2*传统印刷纸 A ...
- MVC验证生成的代码
- 判断是ios还是android
//判断是ios还是androidvar system;var ua = navigator.userAgent.toLowerCase(); if (/iphone|ipad|ipod/.test( ...
- 【Tomcat】Tomcat配置之请求字符串编码
默认情况下,如果tomcat中部署的webservice或者web网站需要有中文的请求参数,而这时候我们直接在浏览器中输入中文那么接受到的将是乱码,无法达到我们的需求,这时候我们就需要对Tomcat的 ...
- css 重新学习系列(2)
摘自: http://www.cnblogs.com/liuzhaoyang/articles/3289456.html Position定位:relative | absolute 定位一直是WEB ...