题目大意是找到一个最多的老鼠序列,使得序列中的老鼠的体重满足递增,相应老鼠的速度满足递减。
思路:就是先按体重递增进行sort排序,然后按照体重找到最长递减子序列即可,用动态规划做比较简单。
态dp[i]表示前i个老鼠中的最长递减子序列长度,状态转移方程为dp[i] = max{dp[ j ]} + 1, 最后找出最大的dp[i]即可。最后的路径用栈输出就可
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,num;
}p[100000];
bool cmp(node p1,node p2)
{
return p1.x==p2.x?p1.y>p2.y:p1.x<p2.x;
}
int dp[100000];
int path[100000];
int main()
{
int n=0;
memset(path,-1,sizeof(path));
while(~scanf("%d%d",&p[n].x,&p[n].y))
{
p[n++].num=n;
// if(n>=9)
// break;
}
sort(p,p+n,cmp);
// for(int i=0;i<n;i++)
// printf("%d\n",p[i].x);
int Maxdp=0,flag=0;
for(int i=0;i<n;i++)
{
dp[i]=1;
for(int j=i-1;j>=0;j--)
{
if(p[j].y>p[i].y&&p[j].x<p[i].x&&dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
path[i]=j;
}
}
if(Maxdp<dp[i])
{
Maxdp=dp[i];
flag=i;
}
}
printf("%d\n",Maxdp);
stack<int>Q;
for(int i=flag;i!=-1;i=path[i])
{
Q.push(p[i].num);
}
while(!Q.empty())
{printf("%d\n",Q.top());
Q.pop();
}
return 0;
}