修炼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 ...
随机推荐
- Go-file
两个包具有文件操作的相关方法,一个是os,一个是syscall,其中os中的相关方法是对syscall相关方法的封装,推荐使用os中的相关方法.文件的打开文件的第一步操作实际上是创建,但是由于文件的打 ...
- OC画笔CGContextRef
1.画线 CGContextRef context = UIGraphicsGetCurrentContext();//context相当于画布 CGContextSetStrokeColorWith ...
- const、volatile、mutable的用法
http://blog.csdn.net/wuliming_sc/article/details/3717017 const.volatile.mutable的用法 const修饰普通变量和指针 co ...
- MySQL外键的作用和创建
MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( ` ...
- english 释词
english 释词 [amount of & number of]the amount of /the number of指……的数量an amount of/a number of 指“大 ...
- asp.net html table to DataTable
添加引用 http://htmlagilitypack.codeplex.com/downloads/get/437941 protected void Export(string content,s ...
- cookie使用随笔
cookie是一种浏览器缓存,可以理解为存放在浏览器上的一种小文件. 大小数目限制: 不同浏览器对于大小和数目均有不一样的限制,大小一般为4k,数目从30~50个(视浏览器类型),以键值对的形式存储, ...
- Hibernate 系列教程4-单向多对一
项目图片 hibernate.cfg.xml <mapping resource="com/jege/hibernate/one/way/manytoone/User.hbm.xml& ...
- linux 查看磁盘、文件夹、文件大小(df du)
du 查看文件夹大小 1.查看当前文件夹中所有文件夹及其子文件夹的大小,注意是文件夹大小,不是文件 # du -h -rw-r--r-- 1 root root 82785865 6月 9 15:53 ...
- web工程中地址的写法
硬盘地址用\ 如:c:\\ 虚拟地址用 / /* 只要是写地址,建议大家最好以"/"开头,/到底代表什么呢? 1.看这个地址是给服务器用的,还是给浏览器用的. 2.如果给浏览器 ...