UVA 10131
来源:互联网 发布:整站优化 百科 编辑:程序博客网 时间:2024/05/18 03:29
题目大意是给定一个序列,每个元素有两项,要求找到最长的子序列,满足第一项递增,第二项递减,其实就是一个简单的DAG动态规划问题,我们将偏序关系定义为若i的第一项小于j的第一项,且i的第二项大于j的第二项,则i《j,那么此时构成DAG,找最长路径即可。
状态的定义和状态转移方程不在多说,适当的总结一下,并不是一定要满足直观的大于小于才能构造DAG,对于一个问题,只要能抽象出偏序关系,即可尝试构造DAG。
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;bool m[1010][1010]={false};int w[1010],iq[1010],size=1;int total[1010],path[1010];int dp(int i){if(total[i]!=-1) return total[i];int ans=-1,pos;for(int j=0;j<=size;j++) if(m[i][j]){int t=dp(j);if(ans<t) {ans=t;pos=j;}}total[i]=ans+1;path[i]=pos;return ans+1;}int main(){//freopen("in.txt","r",stdin);while(cin>>w[size]>>iq[size]) {m[size][0]=true;size++;}size--;memset(total,-1,sizeof(total));path[0]=total[0]=0;for(int i=1;i<=size;i++)for(int j=1;j<=size;j++) if(w[i]<w[j]&&iq[i]>iq[j])m[i][j]=true;int ans=0,pos;for(int i=1;i<=size;i++){int t=dp(i);if(t>ans) {ans=t;pos=i;}}cout<<ans<<endl;while(pos){cout<<pos<<endl;pos=path[pos];}return 0;}
0 0
- UVa 10131
- uva 10131
- UVA 10131
- uva 10131
- UVA 10131
- uva 10131
- uva 10131 越大越聪明
- uva 10131 大象。
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- 黑马程序员——反射基础知识
- Linux 常用操作命令技巧
- DTD学习总结
- Java中正则Matcher类的matches()、lookAt()和find()的区别
- mtk android内置nginx服务器的方法
- UVA 10131
- 月半弯,亦真亦幻亦婉约
- 折线分割平面
- (转)浅谈CSRF攻击方式
- C#的扩展方法
- JAVA中int、String的类型转换
- 数据结构—绪论
- 【web++_第三阶_Ajax_Rest篇】Ajax 第一篇:基础解释和联系,附解释与Rest关系_5
- JAVASE之IO流