从最简单的开始:

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. Moss列表查询,删除条目,更新条目。

    基于Query语句的列表查询 function retrieveListItems(itemId) {    var siteUrl=_spPageContextInfo.webServerRelat ...

  2. Git的安装

    两种方法: 1.命令行git Git preview是命令行Git的安装包,包名如下: Git-1.9.2-preview20140411.exe 2.UI类型的git 图形化界面的git,避免了枯燥 ...

  3. Phonegap解决错误:Error initializing Cordova:Class not found

    Phonegap  解决错误: Alert [ERROR]Error initializing Cordova:Class not found 发现bug后找原因   网上说是  因为找不到     ...

  4. c++11 对象池的实现

    ; template <typename T> class ObjectPool { template <typename... Args> using Constructor ...

  5. linux 守护进程创建流程

    #include <sys/stat.h> #include <fcntl.h> /* Bit-mask values for 'flags' argument of beco ...

  6. SpringMVC redirect乱码问题

    转:http://blog.csdn.net/xubo_zhang/article/details/8239725 spring redirect 用spring redirect中文会乱码:如下示例 ...

  7. 转 Oracle 12C 之 CDB/PDB用户的创建与对象管理

    在Oracle 12C中,账号分为两种,一种是公用账号,一种是本地账号(亦可理解为私有账号).共有账号是指在CDB下创建,并在全部PDB中生效的账号,另一种是在PDB中创建的账号. 针对这两种账号的测 ...

  8. HTML、XHTML和HTML5区别与联系

    1.XHTML与HTML最大的区别: ① XHTML标签名必须小写(错误:<Div> 正确:<div>) ② XHTML元素必须被关闭(错误:<p>  正确:< ...

  9. HDOJ3743<分治>

    题意:求一个排列的逆序数. #include<cstdio> #include<iostream> #include<algorithm> const int ma ...

  10. cell reuse & disposebag

    For my project I've made base cell class TableViewCell: UITableViewCell { private(set) var disposeBa ...