POJ 2533 Longest Ordered Subsequence(DP最长上升子序列O(n^2)&&O(nlogn))
2015-09-12 14:00
736 查看
先说一下简单的O(n^2)的算法:
dp[i]表示以a[i]结尾的最长上升子序列的长度。那么我们每次求dp[i]的时候都要扫一遍所有的a[j]<a[i]然后去dp[j]+1中的最大值,那么复杂度就是O(n^2)的了。
下面是代码
O(nlogn)的算法是用dp[i]来表示最长上升子序列长度为i的结尾元素为dp[i],
那么初始化dp[0]为-oo,其他dp值为+oo,注意这个题目的数据的数组中可能会出现0。
脑补一下就会知道dp的数组是非递减的数组,那么我们要想知道以a[i]结尾的最长上升子序列的长度,我们只需要在dp数组中二分找到a[i]应该在的位置我们就找到了长度。复杂度就成了O(nlogn)
dp[i]表示以a[i]结尾的最长上升子序列的长度。那么我们每次求dp[i]的时候都要扫一遍所有的a[j]<a[i]然后去dp[j]+1中的最大值,那么复杂度就是O(n^2)的了。
下面是代码
#pragma warning(disable:4996) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[1005]; int dp[1005];// dp[i]表示前i个数的以a[i]结尾的最长上升子序列长度 int main() { //freopen("in.txt", "r", stdin); int n; scanf("%d", &n); for (int i = 1; i <= n; i++)scanf("%d", a + i); memset(dp, 0, sizeof dp); int ans = 0; for (int i = 1; i <= n; i++) { dp[i] = 1; for (int j = 1; j < i; j++) { if (a[i] > a[j]) { dp[i] = max(dp[i], dp[j] + 1); } } ans = max(ans, dp[i]); } printf("%d\n", ans); return 0; }
O(nlogn)的算法是用dp[i]来表示最长上升子序列长度为i的结尾元素为dp[i],
那么初始化dp[0]为-oo,其他dp值为+oo,注意这个题目的数据的数组中可能会出现0。
脑补一下就会知道dp的数组是非递减的数组,那么我们要想知道以a[i]结尾的最长上升子序列的长度,我们只需要在dp数组中二分找到a[i]应该在的位置我们就找到了长度。复杂度就成了O(nlogn)
#pragma warning(disable:4996) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[1005]; int dp[1005];// dp[i]表示长度为i的上升子序列是以dp[i]结尾的 int search(int target, int l, int r) {//找到dp[i]<target<=dp[i+1]并返回i while (l < r) { int mid = (l + r + 1) >> 1; if (dp[mid] < target)l = mid; else if (dp[mid] >= target)r = mid - 1; } return l; } int main() { //freopen("in.txt", "r", stdin); int n; scanf("%d", &n); for (int i = 1; i <= n; i++)scanf("%d", a + i); memset(dp, 0x3f, sizeof dp); dp[0] *= -1; int len = 0; for (int i = 1; i <= n; i++) { if (a[i] > dp[len]) { len++; dp[len] = a[i]; } else { int cnt = search(a[i], 0, len); dp[cnt + 1] = a[i]; } } printf("%d\n", len); return 0; }
相关文章推荐
- iOS UItableview加载图片的时候的优化之lazy(懒加载)模式and异步加载模式
- NGUI相关----UITexture图片边缘流光效果
- 多个大小不同的UILabel底部对齐的方法
- iphone中UINavigationBar(导航条视图)的介绍
- iOS学习之KVC中setValuesForKeysWithDictionary:
- UI:关于RGB与16进制颜色值的转换
- 【转】SoapUI5.0创建WebService接口模拟服务端
- UITableView中自定义Cell,自适应高度
- 给NGUI上的预设体动态添加点击事件
- leetcode: Distinct Subsequences
- EQueue文件持久化消息关键点设计思路
- setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key lable1.'
- UIpickerView
- @PathVariable和@RequestParam的区别
- JPA字段映射(uuid,日期,枚举,@Lob)
- Leetcode_232_Implement Queue using Stacks
- Lettcode_232_Implement Queue using Stacks
- 用block改写UIButton点击事件和UIAlerView的按钮点击代理方法
- [iOS UI进阶 - 5.0] 手势解锁Demo
- 【Java】_图形用户界面(GUI)