HDU - 1160 (FatMouse's Speed )最长上升子序列

题意:一个元素有两个属性 w 和 sp 求在w严格递增的情况下 sp严格递减

用结构体 定义三个参数  w  sp  ix , ix是在输入时的顺序  因为我们要排序

之后把结构体数组 按从小到大排序 然后就是最长上升子序列了

代码如下 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10100,INF = 0xfffffff;
struct node{
    int w,sp;
    int ix;
}Node[maxn];

int cmp(node a,node b)
{
    return a.w < b.w;
}

int main()
{
    int w,sp,cnt = 0,path[maxn],dp[maxn],dis[maxn];
    memset(dp,0,sizeof(dp));
    memset(path,0,sizeof(path));
    int n;
    while(cin>>w>>sp)
    {
        Node[cnt].ix = cnt+1;
        Node[cnt].w = w;
        Node[cnt++].sp = sp;
    }
    sort(Node,Node+cnt,cmp);
    for(int i=cnt-1; i>=0; --i)
    {
        for(int j=cnt-1; j>=i; --j)
        {
            if(Node[j].sp < Node[i].sp && Node[j].w > Node[i].w && dp[j] + 1 >= dp[i])
            {
                dp[i] = dp[j] + 1;
                path[Node[i].ix] = Node[j].ix;
            }
        }
    }

    int maxx = -INF,index = 0;
    for(int i=0; i<cnt; i++)
    {
        if(maxx < dp[i])
        {
            maxx = dp[i];
            index = Node[i].ix;
        }
    }
    int ans = 0;
    while(index)
    {
        dis[ans++] = index;
        index = path[index];
    }
    cout<<ans<<endl;
    for(int i=0; i<ans;i++)
        cout<<dis[i]<<endl;
        
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/WTSRUVF/p/9069376.html