zoukankan      html  css  js  c++  java
  • HDU4512完美队形I && HDU1423 Greatest Common Increasing Subsequence (LCIS)

    填坑的时候又到啦,校赛因为不会LCIS所以吃了大亏,这里要补起来。LCIS就是在两个串里找最长上升子序列,相关的博客有很多,这里自己就不写那么多了。

    http://www.cnblogs.com/jackge/archive/2013/05/16/3081793.html

    http://www.cnblogs.com/gj-Acit/p/3236384.html

    上面两个博客对于O(n^2)的做法讲解的比较详细,大家可以参考一下。

    贴两记代码

    HDU1423

    #pragma warning(disable:4996)
    #include <iostream>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    
    #define maxn 550
    int a[maxn];
    int b[maxn];
    int n1, n2;;
    int dp[maxn][maxn];
    
    int main()
    {
        int T; cin >> T;
        while (T--){
            cin >> n1;
            for (int i = 1; i <= n1; i++) scanf("%d", a + i);
            cin >> n2;
            for (int i = 1; i <= n2; i++) scanf("%d", b + i);
            memset(dp, 0, sizeof(dp));
            for (int i = 1; i <= n1; i++){
                int tmp = 0;
                for (int j = 1; j <= n2; j++){
                    dp[i][j] = dp[i - 1][j];
                    if (a[i] > b[j] && dp[i - 1][j] > tmp) tmp = dp[i - 1][j];
                    if (a[i] == b[j]) dp[i][j] = tmp + 1;
                }
            }
            int ans = 0;
            for (int i = 1; i <= n1; i++){
                ans = max(ans, dp[n1][i]);
            }
            printf("%d
    ", ans);
            if (T) puts("");
        }
        return 0;
    }
    

     HDU4512

    #pragma warning(disable:4996)
    #include <iostream>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    
    #define maxn 550
    
    int a[maxn];
    int b[maxn];
    int n;
    int dp[maxn][maxn];
    
    int main()
    {
        int T; cin >> T;
        while (T--)
        {
            cin >> n;
            for (int i = 1; i <= n; i++){
                scanf("%d", a + i);
                b[n + 1 - i] = a[i];
            }
            int ans = 0;
            memset(dp, 0, sizeof(dp));
            for (int i = 1; i <= n; i++){
                int tmp = 0;
                for (int j = 1; j <= n+1-i; j++){
                    dp[i][j] = dp[i - 1][j];
                    if (a[i] > b[j] && dp[i - 1][j] > tmp) tmp = dp[i - 1][j];
                    if (a[i] == b[j]){
                        dp[i][j] = max(dp[i][j],tmp + 1);
                    }
                    if (i < n + 1 - j) ans = max(ans, dp[i][j] * 2);
                    else ans = max(ans, dp[i][j] * 2 - 1);
                }
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    
  • 相关阅读:
    [BZOJ 1001] [BeiJing2006]狼抓兔子
    [BZOJ 1070] [SCOI2007] 修车
    [BZOJ 1834] [ZJOI2010]network 网络扩容
    [POJ 2135] Farm Tour
    [CodeFights] Changu Circle
    [Noip模拟赛] Power
    [Noip模拟赛] Polygon
    【学习】计算几何初步
    【学习】序列DP
    [BZOJ 2659] [Beijing wc2012] 算不出的算式
  • 原文地址:https://www.cnblogs.com/chanme/p/3719609.html
Copyright © 2011-2022 走看看