God's ladder [DP]
2017-08-09 21:40
162 查看
Description
天明来到神之宫殿,在他眼前出现了若干个石柱,每个石柱上有1枚金币,天明可以任意选择一个石柱开始,然后向前方的石柱瞬移,而且他所瞬移到的石柱的高度必须要大于现在所在石柱的高度。求天明所能获得的最大金币数以及任意一种可以获得这么多金币的路线(每个石柱的高度)。
Input
第一行一个数n,表示石柱的个数。然后2~n+1行,每行一个石柱的高度h[i],分别是1,2,,n石柱的高度。
2
Output
第一行为一个数m,表示最大金币数。2~m+1行,每行一个数,分别是每次所瞬移到的石柱的高度。
Sample Input
73
1
2
5
9
6
7
Sample Output
51
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; }
相关文章推荐
- HDU 2809 God of War(DP + 状态压缩)
- hdu 2809 God of War //状态压缩DP
- 1275: God's ladder [DP]
- [HPU OJ 1275] God's ladder [ LIS 及路径输出]
- [HPU]1275: God's ladder [DP]
- Timus 1057 数位dp
- 最长公共子序列DP Common Subsequence HDU 1159
- Codeforces 492B Name That Tune ( 期望DP )
- 【DP】 TOJ 4103. Chinese Hockey 3
- hdoj Flying to the Mars 1800 (DP)
- SDOI2016 R1 day2 T3 征途 斜率优化DP
- Android中的长度单位详解(dp、sp、px、in、pt、mm)
- poj 3017 Cut the Sequence dp
- 传纸条 NOIP2008 洛谷1006 二维dp
- Codeforces 482C Game with Strings(dp+概率)
- [DP动态规划]导弹拦截 - 1999年NOIP普及组
- bzoj 4818 [Sdoi2017]序列计数(简单容斥+快速幂加速dp)
- bzoj4300 绝世好题 【dp】By cellur925
- poj 2923(状态压缩dp)
- hdu1506(dp)