God's ladder [DP]

来源:互联网 发布:淘宝买烟暗语 编辑:程序博客网 时间:2024/06/05 12:01

Description

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

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

Input

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

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

2

Output

第一行为一个数m,表示最大金币数。

2~m+1行,每行一个数,分别是每次所瞬移到的石柱的高度。

Sample Input

7
3
1
2
5
9
6
7

Sample Output

5
1
2
5
6
7

Hint

题意

题解:

AC代码

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;int a[300100];int dp[300100];int par[300100];int tp[300100];void print(int nxt){    if(!nxt) return ;    print(par[nxt]);    printf("%d\n",a[nxt]);}int main(){    int n;    scanf("%d",&n);    for (int i = 1;i <= n; ++i){        scanf("%d",&a[i]);        par[i] = -1;    }    int top = 0;    for (int i = 1; i <= n; ++i){        int pos = lower_bound(dp,dp+1+top,a[i])-dp;        dp[pos] = a[i]; //更新长度操作        par[i] = tp[pos-1]; //记录前驱        tp[pos] = i; //记录位置        //printf("*%d %d %d %d*\n",par[i],tp[pos],pos,dp[pos]);        if (pos>top) top++;    }    printf("%d\n",top);    print(tp[top]);    return 0;}
原创粉丝点击