当前位置: 代码迷 >> 综合 >> HDU 1160 FatMouse's Speed (DP)
  详细解决方案

HDU 1160 FatMouse's Speed (DP)

热度:33   发布时间:2023-12-05 06:28:39.0

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