hdu1160dp

https://vjudge.net/contest/68966#problem/J

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long

using namespace std;

const int N=1005,inf=0x3f3f3f;
struct edge{
   int w,v;//w重量,v速度
   int in;//记录位置
}e[N];
int pre[N];
void print(int x)
{
    if(x!=-1)print(pre[x]);
    else
    return ;
    printf("%d\n",x+1);
}
bool comp(const edge &a,const edge &b)
{
    if(a.w!=b.w)return a.w<b.w;
    return a.v>b.v;
}
int main()
{
    int a,b,cnt=0,dp[N];
    while(scanf("%d%d",&a,&b)!=EOF){
        e[cnt].w=a;
        e[cnt].v=b;
        e[cnt].in=cnt;
        cnt++;
    }
    sort(e,e+cnt,comp);
    memset(pre,-1,sizeof(pre));
    int ans=0,index=0;
    for(int i=0;i<cnt;i++)
    {
        dp[i]=1;
        for(int j=0;j<i;j++)
        {
            if(e[i].w>e[j].w&&e[i].v<e[j].v)
               if(dp[i]<dp[j]+1)
               {
                   dp[i]=dp[j]+1;
                   pre[e[i].in]=e[j].in;
               }
        }
        if(ans<dp[i])
        {
            ans=dp[i];
            index=e[i].in;
        }
    }
    printf("%d\n",ans);
    print(index);
    return 0;
}

输出技巧很重要,也可以使用栈来保存后输出。

刚开始做就是没想到要排序

posted @ 2017-03-17 09:29  walfy  阅读(103)  评论(0编辑  收藏  举报