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; }