zoukankan      html  css  js  c++  java
  • 神秘的咒语

    神秘的咒语

    思路:

    (LCIS)
    (dp[i][j])表示第一个字串(a)前i个和第二个字串(b)前j个以b[j]结尾的最长公共上升子序列的最大长度。
    那么很容易想到(n^3)的方法,$$egin{cases}
    dp[i][j] = max(dp[i-1][j],dp[i][j])(a[i]!=b[j])
    dp[i][j] = max(max(dp[i-1][k])(k<j)and(b[k] < b[j]),dp[i][j])(a[i] == b[j])
    end{cases}$$
    那么上述方法可以优化到((n*m))
    (a[i] == b[j])的时候有(a[i] > b[k])所以维护一个最大(max)(a[i] > b[j])则更新(max = max(max,dp[i-1][j] + 1)).

    题链

    代码:

    #include<bits/stdc++.h>
    typedef long long LL;
    using namespace std;
    LL a[600];
    LL b[600];
    int dp[600][600];
    int main(void)
    {
        int n;
        scanf("%d",&n);
        while(n--)
        {
            memset(dp,0,sizeof(dp));
            int x,y;
            scanf("%d",&x);
            for(int i = 1; i <= x; i++)
                scanf("%lld",&a[i]);
            scanf("%d",&y);
            for(int i = 1; i <= y; i++)
                scanf("%lld",&b[i]);
            int m = 0;
            for(int i = 1; i <= x; i++)
            {
                int maxx = 0;
                for(int j = 1; j <= y; j++)
                {
                    dp[i][j] = max(dp[i][j],dp[i-1][j]);
                    if(a[i] > b[j])
                      maxx = max(maxx,dp[i-1][j]);
                    if(a[i] == b[j])
                        dp[i][j] = max(dp[i][j],maxx + 1);
                }
            }
            for(int i = 1;i <= y;i++)
            {
                m = max(m,dp[x][i]);
            }
            printf("%d
    ",m);
        }
        return 0;
    }
    
    
  • 相关阅读:
    怎么删除json 键值对
    解决html 图片缓存问题
    美工常用的网站分享
    小程序授权页面
    BitMap原理
    css页面加载动画
    可能这些是你想要的H5软键盘兼容方案
    关于范式 :1NF 2NF 3NF等
    Python3学习DAY4
    DTD相关
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/9010403.html
Copyright © 2011-2022 走看看