HDU 1160 FatMouse's Speed
Posted siv0106
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1160 FatMouse's Speed相关的知识,希望对你有一定的参考价值。
这题是动态规划,贪心和排序。
状态表示:d[i]表示前i位的最长满足要求子序列的长度。
状态转移:当重量严格大于前一只并且速度严格大于前一只的时候更新转移数组 d[i]=max(d[i],d[j]+1);
因为不仅要求输出最长的子序列的长度,还要求输出编号,就注意推理,为了减少时间复杂度把小老鼠的体重降序排列
#include<bits/stdc++.h> using namespace std; const int N=1010; int d[N],p[N],cnt=0,ans; struct node { int w,s,num; }a[N]; bool cmp(node x,node y) { return x.w<y.w; } int main() { while(~scanf("%d%d",&a[cnt].w,&a[cnt].s)) { d[++cnt]=1; a[cnt].num=cnt+1; } ans=cnt; d[ans]=0; sort(a,a+cnt,cmp); memset(p,-1,sizeof(p)); cnt-=1; for(int i=cnt;i>=0;i--) for(int j=cnt;j>i;j--) { if(d[j]+1>d[i]&&a[i].w<a[j].w&&a[i].s>a[j].s) { p[i]=j; d[i]=d[j]+1; if(d[ans]<d[i]) ans=i; } } printf("%d ",d[ans]); while(~ans) { printf("%d ",a[ans].num); ans=p[ans]; } return 0; }
以上是关于HDU 1160 FatMouse's Speed的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 1160 FatMouse's Speed(dp+路径记录)
HDU 1160 FatMouse's Speed (动态规划最长下降子序列)