首页 > 代码库 > UVA 10131 Is Bigger Smarter? 【严格单调递增子序列】
UVA 10131 Is Bigger Smarter? 【严格单调递增子序列】
题目:UVA 10131Is Bigger Smarter
题意:给出大象的身高和体重,求身高递增且体重递减的最长序列,都是严格的,并打印序列。
分析:就是先对身高按自增排序,然后求一个单调递减子序列,严格单调的,所以加一句判断,然后打印序列,用一个数组保存就好了
开始想的是先预处理掉重复的,提交wa了,这样不行,因为你不知道体重是最高的还是最低的,可能开始留高的好,后面低的比较好。所以.....
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include <map> #include <cmath> #include <vector> #include <algorithm> using namespace std; const int N = 2000; const int inf = 0x3f3f3f3f; struct Node { int w,h; int num,dp; }; vector<Node> v; vector<int> ans; int cmp(Node a,Node b) { if(a.w!=b.w) return a.w<b.w; } int father[N]; int main() { //freopen("Input.txt","r",stdin); int cnt=1; Node tmp; while(~scanf("%d%d",&tmp.w,&tmp.h)) //输入 { tmp.num=cnt++; tmp.dp=0; v.push_back(tmp); } sort(v.begin(),v.end(),cmp); memset(father,0,sizeof(father)); v[0].dp=1; bool ok=false; int count=0,ss=1,ttp=1; for(int i=1; i<v.size(); i++) { int ff=0,cas=0; for(int j=i-1; j>=0; j--) { if(v[i].h<v[j].h && v[i].w!=v[j].w) { if(ff<v[j].dp) { ff=v[j].dp; cas=j; } } } v[i].dp=ff+1; father[i]=cas; if(count<v[i].dp) { count=v[i].dp; ss=i; if(ok) { ttp=i; ok=true; } } } printf("%d\n",count); for(int i=ss;i>=ttp;i=father[i]) { ans.push_back(v[i].num); } for(int i=ans.size()-1;i>=0;i--) printf("%d\n",ans[i]); v.clear(); v.clear(); ans.clear(); return 0; }
UVA 10131 Is Bigger Smarter? 【严格单调递增子序列】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。