您的位置:首页 > 编程语言 > Go语言

[HPU]1275: God's ladder [DP]

2017-03-06 11:03 176 查看
题目描述

天明来到神之宫殿,在他眼前出现了若干个石柱,每个石柱上有1枚金币,天明可以任意选择一个石柱开始,然后向前方的石柱瞬移,而且他所瞬移到的石柱的高度必须要大于现在所在石柱的高度。

求天明所能获得的最大金币数以及任意一种可以获得这么多金币的路线(每个石柱的高度)。

输入

第一行一个数n,表示石柱的个数。

然后2~n+1行,每行一个石柱的高度h[i],分别是1,2,,n石柱的高度。

2

题解

最长上升子序列问题,这题的“亮点”是路径的还原

原题链接

#include<cstdio>
#include<algorithm>
#define MAX_N 200200
using namespace std;

int par[MAX_N];
int pit[MAX_N];
int dp [MAX_N];

int res[MAX_N];

void print(int next){
if(!next) return ;
print(par[next]);
printf("%d\n",res[next]);
}

int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&res[i]);
par[i]=i;
}
int rank=0;
for(int i=1;i<=n;i++){
int updataid=lower_bound(dp,dp+1+rank,res[i])-dp;
dp[updataid]=res[i];
par[i]=pit[updataid-1];
pit[updataid]=i;

if(updataid>rank){
rank++;
}
}
printf("%d\n",rank);
print(pit[rank]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: