hdu1160 FatMouse's Speed (dp,记录路径)

来源:互联网 发布:苹果怎么加密软件 编辑:程序博客网 时间:2024/05/17 02:49

题意:输出一组数列,小鼠的体重增加,速度减少,保证这组数列数量最多。

思路:其实是很经典的dp,一个数字排序好后,求最大递增数列,就是有很多细节问题,还有保存路径。用一个数组,把每一组数的前一组位置保留下来,最后用递归输出。

还有就是这道题必须eof才能输出结果,导致我的电脑总是看不到结果,凭运气A。。。


#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <algorithm>#include <cstring>#include <utility>#define ll long long#define INF 0x3f3f3f3fusing namespace std;int dp[1005];int r[1005];int dpmax=1,dpi;struct node{int m,s;int num;}a[1005];bool cmp(node x,node y){if(x.m<y.m)return 1;else if(x.m==y.m && x.s>y.s) return 1;else return 0;}void p(int e){if(e==0) return;p(r[e]);//e的前一个是r[e]printf("%d\n",a[e].num);}int main(){int k=0;while(scanf("%d%d",&a[k].m,&a[k].s)!=EOF){a[k].num=k+1;//因为k是从0开始的k++;}sort(a,a+k,cmp);//按照m从小到大,m相等时按s从大到小for(int i=0;i<k;i++)dp[i]=1;//dp[i]表示第i个以前中,最多的答案//printf("asdje\n");for(int i=0;i<k;i++){for(int j=0;j<i;j++)if(a[i].s<a[j].s && a[i].m!=a[j].m && dp[i]<dp[j]+1){dp[i]=dp[j]+1;//加上ir[i]=j;//保留路径}if(dpmax<dp[i]){dpmax=dp[i];//保留最大的,也就是答案dpi=i;//答案的最后一对值}}printf("%d\n",dpmax);//个数p(dpi);//用递归输出路径return 0;}


0 0