这道题的思路想通了就很简单。不需要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