HDU1160 FatMouse's Speed 带路径的最长上升子序列问题

点击打开链接

题目大意是找到一个最多的老鼠序列,使得序列中的老鼠的体重满足递增,相应老鼠的速度满足递减。

思路:就是先按体重递增进行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;
}


你可能感兴趣的:(HDU1160 FatMouse's Speed 带路径的最长上升子序列问题)