HDU 1160 FatMouse's Speed (DP)

来源:互联网 发布:java分布式 编辑:程序博客网 时间:2024/05/16 01:36

这道题的思路想通了就很简单。不需要DP转移公式,想多了,一直想推出来反而写错了。明明刘春英讲DP的时候已经想通了还是会错,还是练得少啊。

根据题意的意思就是要先将数据按体重递增,速度递减排序后找最长子序列。

所以推荐用sort函数排好后循环判断就好。

不过题目要求的是输出数据的位置,所以还要定义一个结构体去储存下。

//题意自己看,不会度娘
#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>using namespace std; struct node{int w;int s;int flag; }a[1005];struct node1{int num;int count;}dp[1005];bool cmp(node a,node b){if(a.w==b.w)return a.s>b.s;return a.w<b.w;}int main(int argc, char *argv[]){int max,t;int i,j,k;i=0;while(scanf("%d %d",&a[i].w,&a[i].s)!=EOF){a[i].flag=i+1;i++;//printf("*%d",i); }sort(a,a+i,cmp);//printf("*1\n");for(j=0;j<i;j++){dp[j].num=1;dp[j].count=0;}max=1;t=1;for(j=1;j<i;j++){for(k=0;k<j;k++){if(a[j].s<a[k].s&&a[j].w>a[k].w){if(dp[j].num<dp[k].num+1){dp[j].num=dp[k].num+1;dp[j].count=k;} }}if(dp[j].num>max){max=dp[j].num;t=j;}}printf("%d\n",max);int m[1005];for(j=1;j<=max;j++){m[j]=t;t=dp[t].count;}for(k=max;k>=1;k--)printf("%d\n",a[m[k]].flag); return 0;}
//Start-ZJ
//2017/12/19/10:38