您的位置:首页 > 其它

DP LIS 记录路径 hdu 1160

2014-05-04 23:57 387 查看
按照:

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


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

排序

可以先排一半...#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
.w,&x
.s)!=EOF){
x
.num=n;
dp
=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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: