题目描述
天明来到神之宫殿,在他眼前出现了若干个石柱,每个石柱上有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;
}