FatMouse's Speed---hdu1160(简单dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160

题意就是给你一些老鼠(编号1,2,3,4,5,6,7,8...)的体重和他们的速度然后求出最大的n满足

W[m[1]] < W[m[2]] < ... < W[m[n]] 

and 

S[m[1]] > S[m[2]] > ... > S[m[n]] 

然后把原来的编号按照上面的序列输出来;

先把他们排序一下dp的时候记录一下路径;

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 1550
#define INF 0xffffff
struct node
{
    int w, s, id;
}a[N];
int cmp(node p, node q)
{
    if(p.w!=q.w)
        return p.w<q.w;
    return p.s>q.s;
}
int main()
{
    int n=0, dp[N], pre[N];
    ///freopen("in.txt", "r", stdin);
    while(scanf("%d%d", &a[n].w, &a[n].s)!=EOF)
    {
        a[n].id=n+1;
        n++;
    }
    sort(a, a+n, cmp);
    memset(dp, 0, sizeof(dp));
    memset(pre, -1, sizeof(pre));
    int Max = 0;
    int Index = -1;
    for(int i=0; i<n; i++)
    {
        dp[i]=1;
        for(int j=0; j<i; j++)
        {
            if(a[j].w<a[i].w && a[j].s>a[i].s)
            {
                if(dp[j]+1>dp[i])
                {
                    dp[i]=dp[j]+1;
                    pre[i]=j;
                }
            }
        }
        if(Max<dp[i])
        {
            Max = dp[i];
            Index = i;
        }
    }
    printf("%d\n", Max);
    int b[N]={0},k=0;
    for(int i=Index; i!=-1; i=pre[i])
    {
        b[k++]=a[i].id;
    }
    for(int i=k-1; i>=0; i--)
        printf("%d\n", b[i]);
    return 0;
}
View Code

 

posted @ 2015-11-01 11:33  西瓜不懂柠檬的酸  Views(125)  Comments(0Edit  收藏  举报
levels of contents