HDU 4512 最长公共上身子序列(加强)
2013-03-27 10:14
197 查看
dp[i][j] 表示a(1,i),b(1,j)取以a[i], b[j]结尾的最大公共上升子串的大小
刚开始的做法是:取一个点,将a数组分成两个部分。前面的为b,后面的为c。将前面的逆置。然后判断最长公共上升序列。问题在于判断中间是否存在很大的数比较困难。要记录开始的点。。搞了半天WA。
而采取不逆置的方法。将从两端开始像中间比较。这样显然容易知道中间的数字与最后一个相等数字的关系。。如以上代码所示。。
#include <iostream> using namespace std; const int N = 205; int dp ; int a ; int main() { int t; cin >> t; while(t--) { int n; cin >> n; for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); } int ans = 1; for(int i = 1; i <= n; i++) { int max = 0; for(int j = n; j > i; --j) { dp[i][j] = dp[i-1][j]; if(a[i] == a[j] && dp[i][j] < max + 1) dp[i][j] = max + 1; if(a[i] > a[j] && dp[i-1][j] > max) //在b串中, 取一个小于a[i]的数结尾的最大长度 max = dp[i-1][j]; if(dp[i][j]*2 > ans) ans = dp[i][j] * 2; for(int k = i; k < j; k++) { //判断中间是否存在一个很大的数 if(a[k] > a[j]) { if(2*dp[i][j]+1 > ans) ans = 2 * dp[i][j] + 1; } } } } printf("%d\n", ans); } return 0; }
刚开始的做法是:取一个点,将a数组分成两个部分。前面的为b,后面的为c。将前面的逆置。然后判断最长公共上升序列。问题在于判断中间是否存在很大的数比较困难。要记录开始的点。。搞了半天WA。
而采取不逆置的方法。将从两端开始像中间比较。这样显然容易知道中间的数字与最后一个相等数字的关系。。如以上代码所示。。
相关文章推荐
- hdu 4512(最长公共递增子序列加强版)
- HDU 4512 吉哥系列故事——完美队形I LCIS 最长递增公共子序列
- hdu 4512 吉哥系列故事——完美队形I(最长上升公共子序列)
- [HDU 4512] 吉哥系列故事——完美队形I 最长上升公共子序列
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升序列)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升序列)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
- 最长递增公共子序列dp(hdu 1423 hdu 4512)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
- hdu 1423 Greatest Common Increasing Subsequence (最长上升公共子序列)
- HDU 1423(Greatest Common Increasing Subsequence)公共最长不降子序列
- HDU 5904 LCIS(最长上升公共子序列)
- HDU-4512 吉哥系列故事——完美队形I 最长公共上升子序列
- HDU 1423 最长上升公共子序列(LCIS)
- 最长公共子序列 最长递增子序列(和) 最长递增公共子序列 最长(连续)子序列乘积(HDU)--dp
- hdu 1243 反恐训练营 最长公共字序列
- hdu 1423 最长上升公共子序列 LCIS 模板题
- HDU 1423 求求求求求求最长上升公共子序列
- hdu 1423 最长递增公共子序列