从最简单的开始:

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. cmstop框架中的js设计content.js

    控制cmstop框架中action的js 内容模块 找出当前页面的js的思路01先找显示页面的当前文件.在页面文件中-->找(编辑,删除)按钮-->找获取这个按钮的js选择器 02看加载的 ...

  2. SharePoint 2010 Modal Dialog

    SharePoint 2010 Modal Dialog Tweet   Modal dialog play very important role to improve the user exper ...

  3. 解决ORA-00904: invalid identifier标识符无效

    方法/步骤 1 大部分情况下,此错误是由于引用了不存在的列名导致的.比如select name from Studtent 当studeng表中无name列时,系统就会报此错误. 2 解决思路是,确定 ...

  4. cdn是什么

    CDN的全称是Content Delivery Network,即内容分发网络.其目的是通过在现有的Internet中增加一层新的网络架构, 将网站的内容发布到最接近用户的网络”边缘”,使用户可以就近 ...

  5. Ckeditor配置

    配置参考文档,主要将ckeditor中的(adapters.images.lang.plugins.skins.themes.ckeditor.js.config.js.contents.css)解压 ...

  6. iabtis初探

    1.简介 与Hibernate相比,ibatis属于一种半自动的ORM框架,主要解决了java对象与SQL入参及结果集的映射关系.简单易学.容易上手:但是安全性较差,对于金融等对安全要求较高的系统来说 ...

  7. 【dp 背包变形】 poj 1837

    #include <cstdio> #include <memory.h> #include<iostream> using namespace std; ][]; ...

  8. 关于C#静态构造函数的几点说明

    静态构造函数是C#的一个新特性,其实好像很少用到.不过当我们想初始化一些静态变量的时候就需要用到它了.这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次.也就是在创建第一个 ...

  9. php mysql 实现消息队列

    最近遇到一个批量发送短信的需求,短信接口是第三方提供的.刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗? 但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低. 于是想到,用PHP和 ...

  10. oracle 锁表的处理。

    最近系统每天经常锁表,进程杀死后,很快再次锁住这个表. (一)先贴出现场处理死锁的步骤. 另外:有时候通过PL/SQL执行kill session可能仍然无法解锁,此时需要登陆到Oracle服务器将进 ...