题意:有一大坨老鼠,每只老鼠都有体重和速度两个属性,为了证明越重的老鼠速度越慢,你需要找到一个最长的序列:体重递增,速度递减。
思路:动态规划,注意要记录下老鼠的原始编号。
AC代码: 参考kuangbinju哒哒哒~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxx 1005
struct 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;
}