首页 > 代码库 > hdu 1160 FatMouse's Speed
hdu 1160 FatMouse's Speed
题目:寻找最长上升自序列。
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; struct node { int w,s; //重量,速度 int num; //编号 int t; //用来记录当前编号前面的最优解的编号 }root[1010]; bool cmp(node a,node b) //先按照重量最小排,然后按照速度最大排 { if(a.w!=b.w) return a.w<b.w; return a.s>b.s; } int main() { int x,y,i=0,j; int dp[1010]; //dp数组用来记录当前编号对应的最优解 memset(root,0,sizeof(root)); while(cin>>x>>y) { dp[i]=1; root[i].num=i+1; root[i].w=x;root[i++].s=y; } int n=i,ans=0; sort(root,root+n,cmp); for(i=0;i<n;i++) cout<<root[i].num<<":"<<root[i].w<<" "<<root[i].s<<endl; for(i=0;i<n;i++) { int p=-1; //记录当前编号前面的最优解的编号 for(j=0;j<i;j++) if(root[i].w>root[j].w&&root[i].s<root[j].s) { if(dp[i]<dp[j]+1) dp[i]=dp[j]+1,p=j; } if(p>=0) root[i].t=p; if(dp[ans]<dp[i]) ans=i; } cout<<dp[ans]<<endl; int t=dp[ans],p=ans; n=dp[ans]; while(t) //类似递归来寻找对应的序列 { dp[t]=root[p].num; //节省空间,请原谅我的节俭^ ^ p=root[p].t; t--; } for(i=1;i<=n;i++) cout<<dp[i]<<endl; return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。