Uva 10131Is Bigger Smarter (DP_最长递增子序列)

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=114&problem=1072


题目大意给定n个人的体重和IQ,要找一个序列,满足除第一个人外每个人的体重都比前一个轻,IQ比前一个高,并输出最长的序列。


解题思路:先对体重或IQ进行排序然后求最长递增子序列并输出随便一个解。


测试数据:

6008 1300
6000 2100
500 2000
1000 4000
1100 3000
6000 2000
8000 1400
6000 1200
2000 1900


代码:

#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX 1100


struct node {

    int w,IQ,in;
}arr[MAX];
int n,dp[MAX],path[MAX];
int top,ans[MAX];


int cmp(node a,node b) {

    if (a.w == b.w)
        return a.IQ > b.IQ;
    else return a.w < b.w;
}


int main()
{
    int i,j,k,maxx,maxi;
    top = n = 1,maxx = maxi = 0;
    arr[0].w = 0,arr[0].IQ = 20000;


    while (scanf("%d%d",&arr[n].w,&arr[n].IQ) != EOF)
        arr[n].in = n,n++;
    sort(arr+1,arr+n,cmp);
    for (i = 1; i < n; ++i)
        for (j = 0; j < i; ++j)
            if (arr[i].w > arr[j].w && arr[i].IQ < arr[j].IQ
                    && dp[i] < dp[j] + 1) {

                dp[i] = dp[j] + 1,path[i] = j;
                if (dp[i] > maxx) maxx = dp[i],maxi = i;
             }

        printf("%d\n",maxx);
        while (maxi != 0) {
            
          //  printf("%d\n",maxi);
            ans[top++] = maxi,maxi = path[maxi];
        }
        for (i = top - 1;i >= 1; --i)
            printf ("%d\n",arr[ans[i]].in);
}

本文ZeroClock原创,但可以转载,因为我们是兄弟。

你可能感兴趣的:(struct,测试,Path)