HDU 1160(我真的不会DP啊啊啊啊)

来源:互联网 发布:linux 脚本优先级 编辑:程序博客网 时间:2024/04/19 21:48

题意:有一大坨老鼠,每只老鼠都有体重和速度两个属性,为了证明越重的老鼠速度越慢,你需要找到一个最长的序列:体重递增,速度递减。

思路:动态规划,注意要记录下老鼠的原始编号。

AC代码: 参考kuangbinju哒哒哒~可怜

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxx 1005struct M{  int w,v,index;}m[maxx];bool cmp(M a,M b){  if(a.w!=b.w)  return a.w<b.w;  else return a.v>b.v;}int main(){   int n=1;   int dp[maxx],res[maxx],pre[maxx];   while(scanf("%d%d",&m[n].w,&m[n].v)!=EOF)   {     dp[n]=1;     m[n].index=n;     n++;   }   int maxlen=0,maxi=0;   sort(m+1,m+n+1,cmp);   for(int i=1;i<n;i++)   {    for(int j=1;j<i;j++) {   if(m[j].w<m[i].w&&m[j].v>m[i].v&&(dp[j]+1)>dp[i])   {    dp[i]=dp[j]+1;    pre[i]=j;    if(dp[i]>maxlen){  maxlen=dp[i];  maxi=i;}  } }   }   int num=maxlen;   res[num]=maxi;   num--;   while(num)   {     res[num]=pre[maxi];     maxi=pre[maxi];     num--;   }   printf("%d\n",maxlen);   for(int i=1;i<=maxlen;i++)   {   printf("%d\n",m[res[i]].index);   }   return 0;}

0 0
原创粉丝点击