[HPU]1275: God's ladder [DP]
2017-03-06 11:03
176 查看
题目描述
天明来到神之宫殿,在他眼前出现了若干个石柱,每个石柱上有1枚金币,天明可以任意选择一个石柱开始,然后向前方的石柱瞬移,而且他所瞬移到的石柱的高度必须要大于现在所在石柱的高度。
求天明所能获得的最大金币数以及任意一种可以获得这么多金币的路线(每个石柱的高度)。
输入
第一行一个数n,表示石柱的个数。
然后2~n+1行,每行一个石柱的高度h[i],分别是1,2,,n石柱的高度。
2
原题链接
天明来到神之宫殿,在他眼前出现了若干个石柱,每个石柱上有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; }
相关文章推荐
- 1275: God's ladder [DP]
- [HPU OJ 1275] God's ladder [ LIS 及路径输出]
- HPU1280 迷上象棋的HH【DP】
- hdu 2809 God of War //状态压缩DP
- [HPU] Cafeteria [dp][01背包]
- HPU 1911 Graphics [DP、DFS、分类讨论]
- 【hpu oj 1015 985的方格难题 [DP、数学] 】 dc29
- zjnu 1275 最大的算式(Bigexp)(区间DP)
- HPU 1280: 迷上象棋的HH【dp】
- HPU 1717:感恩节KK专场——爬楼梯【dp】
- [CodeForces 279C] Ladder (DP)
- CodeForces 279C Ladder (RMQ + dp)
- hpu 1082: 循环数组最大子段和 [DP]
- happy number 中南OJ 1275 数位DP
- 【HPU 1267 Cafeteria】+ 01dp
- God's ladder [DP]
- 【HPU 1019 】985的买饮料难题 (dp)
- HDU 2809 God of War(DP + 状态压缩)
- 状态压缩dp/sgu 131 Hardwood floor
- ZOJ 1108 FatMouse's Speed (HDU 1160) DP