hdu4512(最长上升公共子序列变形)
2014-11-28 19:51
417 查看
题意就是找出最长的一个序列满足如下条件:1、整个序列对称;2、前半段序列非递减
想想其实可以将序列倒序存储到另一个数组,然后比较两个数组的最长上升子序列。注意一点 j<(n-i+!) 这点很重要,因为有可能出现两个序列的最长公共子序列在原序列中有重叠部分。具体方法见代码
想想其实可以将序列倒序存储到另一个数组,然后比较两个数组的最长上升子序列。注意一点 j<(n-i+!) 这点很重要,因为有可能出现两个序列的最长公共子序列在原序列中有重叠部分。具体方法见代码
#include<iostream> #include<string> #include<stdio.h> #include<algorithm> #include<math.h> #include<stdlib.h> #include<ctype.h> #include<string.h> using namespace std; typedef long long lld; #define oo 0x3f3f3f3f #define maxn 205 int dp[maxn]; int a[maxn], b[maxn]; int main() { int T, n, ans; scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); b[n - i + 1] = a[i]; } int k; ans = 0; memset(dp, 0, sizeof dp); for (int i = 1; i <= n; i++) { k = 0; for (int j = 1; j <= (n - i + 1); j++) { if (b[j] < a[i] && dp[j] > dp[k]) k = j; if (a[i] == b[j] && dp[k] + 1 > dp[j]) dp[j] = dp[k] + 1; if (i < (n - j + 1)) ans = max(ans, dp[j] * 2); else ans = max(ans, dp[j] * 2 - 1); } } printf("%d\n", ans); } return 0; } /* 1 5 1 4 2 5 -12 4 -12 1 2 4 */
相关文章推荐
- array array array (最长上升子序列变形)
- uva 10131 Is Bigger Smarter ? (简单dp 最长上升子序列变形 路径输出)
- hdu 1423 最长上升公共子序列 LCIS 模板题
- hdu1160(最长上升子序列变形)
- hdoj 1423 Greatest Common Increasing Subsequence(最长上升公共子序列)
- array array array (最长上升子序列变形)
- 动态规划 最长公共子序列 最长上升子序列 最长上升公共子序列
- 最长公共上升子序列 csu1120 病毒
- Codeforces 10D LCIS 求最长公共上升子序列及输出这个子序列 dp
- 最长上升公共子序列(LCIS)
- HDU1020(最长上升子序列变形)
- HDU 1423 (最长上升公共子序列)
- array array array (最长上升子序列变形)
- ZOJ3519-Beautiful People:最长上升子序列的变形
- HDU - 2881 Jack's struggle (最长上升子序列变形)
- 【HDU】5256 序列变换(最长上升子序列变形)
- array array array (最长上升子序列变形)
- NYOJ-矩形嵌套(最长上升子序列变形)
- 最长上升子序列的变形(N*log(N))hdu5256
- HDU 5904 LCIS (最长公共上升序列)