暑期dp46道(13)——HDOJ 1160FatMouse's Speed 排序+最长严格下降子序列+回溯

来源:互联网 发布:大话西游手游抢星软件 编辑:程序博客网 时间:2024/05/22 09:02

题目链接:HDOJ 1160



题意:给定一组mice的体重w和速度s,输入以EOF结尾,求出任意一组w严格上升,s严格下降的mice序列的长度以及按顺序的下标


分析:这题如果先把所有mice的w按升序排列,就变成了求s严格下降的最长子序列,并回溯输出下标


这里用结构体记录数据并排序。


代码:

#include<cstdio>#include<cstring>#include<string>#include<algorithm>//sort(); using namespace std;#define debug 0#define M(a) memset(a,0,sizeof(a))#define Max(a,b) ((a>b)?a:b)const int maxn=1000+5;int dp[maxn],pre[maxn],t;struct R{int w;int s;int index;//记录输入的下标,用于输入 }r[maxn];bool cmp(const R a,const R b){//if(a.w==b.w)//return a.s>b.s;return a.w<b.w;//按w的升序排序}void print(int x){printf("%d\n",r[x].index);if(pre[x]){print(pre[x]);}}void Do(){int ans=0,cnt;sort(r+1,r+t,cmp);//cmp();函数是控制排序的 for(int i=t-1;i>=1;i--){dp[i]=1;for(int j=i+1;j<t;j++){if(r[i].w<r[j].w&&r[i].s>r[j].s&&dp[j]+1>dp[i]){dp[i]=dp[j]+1;pre[i]=j;//记录前一个排序后的下标 }}if(ans<dp[i]){ans=dp[i];//ans记录当前最长序列的lengthcnt=i;//当前所求最长序列的起始排序后下标,用于回溯 }}printf("%d\n",ans);print(cnt);//回溯输出} int main(){#if debugfreopen("in.txt","r",stdin);#endif//debugM(dp);M(pre);t=1;int a,b;while(~scanf("%d%d",&a,&b))//输入以EOF结尾{r[t].w=a;r[t].s=b;r[t].index=t;t++;}Do();return 0;} 

1 0
原创粉丝点击