pku 2533 最长上升子序列
2009-03-14 17:19
239 查看
#include <iostream> using namespace std; #define MAX 1001 int A[MAX]; int L[MAX]; int main() { int n, max; scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &A[i]); //dp L[1] = 1; for(int i = 1; i <= n-1; ++i) { max = 1; for(int j = 1; j <= i; ++j) if(A[j] < A[i+1]) if(max < L[j] + 1) max = L[j] + 1; L[i+1] = max; } //result max = L[1]; for(int i = 2; i <= n; ++i) if(L[i] > max) max = L[i]; printf("%d/n", max); return 0; } /***********************************************************/ /* L[i]表示以A[i]为最后一位的最长子序列的最大长度 状态转移方程: L[i+1] = max{(A[j]<A[i+1]) | L[j]+1}(j:1 -> i) */ /***********************************************************/ /***********************************************************/ //下面摘自牛人的经典思路O(n*logn): /* 第2种方法时间复杂度为O(nlogn),用到了二分查找和贪心。 其操作如下: 开辟一个栈,每次取栈顶元素s和读到的元素a做比较,如果a>s, 则加入栈;如果a<s,则二分查找栈中的比a大的第1个数,并替换。 最后序列长度为栈的长度。 这也是很好理解的,对x和y,如果x<y且E[y]<E[x],用E[x]替换 E[y],此时的最长序列长度没有改变但序列Q的''潜力''增大。 举例:原序列为1,5,8,3,6,7 栈为1,5,8,此时读到3,则用3替换5,得到栈中元素为1,3,8, 再读6,用6替换8,得到1,3,6,再读7,得到最终栈为1,3,6,7 ,最长递增子序列为长度4。 */ /**********************************************************/ #include <iostream> using namespace std; int A[1001], stack[1001]; int top; void solve(int& v) { int low = 1, high = top; int mid; while(low <= high) { mid = (low+high) >> 1; if(stack[mid] < v) low = mid+1; else high = mid-1; } if(low == top+1) top++; stack[low] = v; }//二分low返回v的位置,或v的下一值 int main() { int n; scanf("%d", &n); for(int i = 1; i <= n; ++i) { scanf("%d", &A[i]); solve(A[i]); } printf("%d/n", top); return 0; } //From:http://www.cppblog.com/RyanWang/archive/2008/11/16/67029.html
相关文章推荐
- PKU2533 最长上升子序列 DP
- [动态规划]之裸lis之最长上升子序列POJ 2533
- poj_2533 Longest Ordered Subsequence(最长上升子序列)
- Pku1887----Testing the CATCHER (经典动态规划题:最长下降子序列),,,,,捎带pku2533---Longest Ordered Subsequence
- DP LIS(最长上升子序列) POJ 2533 POJ 1836 POJ 2138 HDU 1069
- POJ 2533-Longest Ordered Subsequence(dp_最长上升子序列)
- 最长上升子序列 POJ 2533(n*n与 nlogn)
- 【Poj 2533】 Longest Ordered Subsequence 最长上升子序列
- POJ2533, 最长上升子序列(贪心+二分查找时间复杂度O(nlogn))
- POJ2533 Longest Ordered Subsequence (最长上升子序列)
- POJ 2533 Longest Ordered Subsequence 最长上升子序列
- DP LIS(最长上升子序列) POJ 2533 POJ 1836 POJ 2138 HDU 1069
- Longest Ordered Subsequence - POJ 2533 最长上升子序列
- POJ 2533 Longest Ordered Subsequence(最长上升子序列O(n*n)解法)
- Longest Ordered Subsequence POJ - 2533 (最长上升子序列)
- poj2533-Longest Ordered Subsequence(最长上升子序列)
- poj 2533 数组的最长上升子序列
- 最长上升子序列 POJ 2533(n*n与 nlogn)
- poj 2533 最长上升子序列
- POJ-2533 Longest Ordered Subsequence (线性dp 最长上升子序列)