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