uva481(打印LIS路径)
2017-04-20 19:16
465 查看
1. 思路
对于LIS的求解问题,我采用的是二分+贪心进行求解,然后对于打印路径采用一个f[]数组记录,f[i]代表LIS序列中的第i个元素的前面的一个元素的位置;2. code
#include <cstdio> #include <cstring> #include <algorithm> #include <stack> using namespace std; const int N = 1e5+5; int val , dp , f , pos ; int main() { int n = 0; int m; while(scanf("%d", &m) != EOF) { val[n++] = m; } memset(dp, 0x3f3f3f3f, sizeof(dp)); // dp[0] = 0; for(int i = 0; i < n; ++ i) { int lpos = lower_bound(dp, dp+n, val[i]) - dp; //在已构造的LIS序列中找出大于等于val[i]的元素的位置 dp[lpos] = val[i]; pos[lpos] = i; f[i] = (lpos ? pos[lpos-1] : -1); // 记录路径 } stack<int> s; n = lower_bound(dp, dp+n, 0x3f3f3f3f) - dp; printf("%d\n-\n", n); for(int i = pos[n-1]; i != -1; i = f[i]) { // 从LIS序列的最后一个元素向前回溯 s.push(val[i]); } while(!s.empty()) { printf("%d\n", s.top()); s.pop(); } return 0; }
相关文章推荐
- uva 10131 Is Bigger Smarter?(动态规划:LIS变形+路径打印)
- UVa 103 - Stacking Boxes (LIS,打印路径)
- Uva 10131 Is Bigger Smarter? (LIS,打印路径)
- UVA 481 What Goes Up LIS+nlog(n)算法,打印路径
- UVa 103 - Stacking Boxes (LIS,打印路径)
- Uva 10131 Is Bigger Smarter? (LIS,打印路径)
- ZOJ 1076 Gene Assembly(LIS+路径打印 贪心)
- uva624(01背包+打印路径)
- uva 531 - Compromise(LCS+打印路径)
- uva 11404 LCS打印字典序最小路径
- uva10564(DP+路径打印)
- UVA - 10599(求LIS,记录路径数)
- uva 624 (01背包打印路径)
- [UVA 10054]The Necklace[欧拉回路][打印路径]
- UVA 624 CD (01背包+打印路径)
- UVa 10054 - The Necklace, 欧拉回路+打印路径
- LIS最长上升子序列(打印路径)
- uva11374迪杰斯特拉最短路径+打印
- hdu--1160--LIS+打印路径
- UVA - 624CD(递推+ 路径打印)