DP LIS 记录路径 hdu 1160
按照:
W[m[1]] < W[m[2]] < ... < W[m[n]]
S[m[1]] > S[m[2]] > ... > S[m[n]]
排序
可以先排一半...
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX 1003
struct node {
int w,s,num;
}x[MAX];
int out[MAX],dp[MAX],index[MAX];
bool cmp(node a,node b){
return a.w<b.w;
}
int main()
{
int t,n=1,i,j,k;
memset(index,0,sizeof(index));
memset(dp,0,sizeof(dp));
while(scanf("%d%d",&x[n].w,&x[n].s)!=EOF){
x[n].num=n;
dp[n]=1;
n++;
}
sort(x,x+n,cmp);
for(i=1;i<=n;i++){
for(j=1;j<i;j++){
if(x[i].w>x[j].w&&x[i].s<x[j].s&&dp[j]+1>dp[i]){
dp[i]=dp[j]+1;
index[x[i].num]=x[j].num;
}
}
}
int ans=0;
for(i=1;i<=n;i++){
if(dp[i]>ans){
ans=dp[i];
k=x[i].num;//记录路径
}
}
printf("%d\n",ans);
for(i=ans;i>=1;i--){
out[i]=k;
k=index[k];
}
for(i=1;i<=ans;i++)
printf("%d\n",out[i]);
return 0;
}

浙公网安备 33010602011771号