hdu1160dp

时间:2023-01-26 08:23:32

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=,inf=0x3f3f3f;
struct edge{
int w,v;//w重量,v速度
int in;//记录位置
}e[N];
int pre[N];
void print(int x)
{
if(x!=-)print(pre[x]);
else
return ;
printf("%d\n",x+);
}
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=,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,-,sizeof(pre));
int ans=,index=;
for(int i=;i<cnt;i++)
{
dp[i]=;
for(int j=;j<i;j++)
{
if(e[i].w>e[j].w&&e[i].v<e[j].v)
if(dp[i]<dp[j]+)
{
dp[i]=dp[j]+;
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 ;
}

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

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

相关文章