• CF10D LCIS (动态规划)


    题目链接

    Solution

    动态规划.
    (f_{i,j}) 表示 (a) 数组前 (i) 个和 (b) 数组前 (j) 所得的最长的 LCIS .
    转移很好想:
    (a_i!=b_j :~f_{i,j}=f_{i-1,j})
    (a_i==b_j :~f_{i,j}=max(f_{i-1,j},f_{i,t(存储位置)}+1))

    然后最后面 (f[n][i]) 中的最大值即为答案.

    Code

    #include<bits/stdc++.h>
    int n,a[502],b[502];
    int f[502][502],g[502][502]; 
    void Print(int p) {
        if(!p)         
            return ;
        Print(g[n][p]);
        printf("%d ",b[p]);
    }
    int main() {
        int m,p=0;
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            scanf("%d",a+i);
        scanf("%d",&m);
        for(int i=1;i<=m;++i)
            scanf("%d",b+i);
        for(int i=1,t=0;i<=n;++i,t=0)
            for(int j=1;j<=m;++j) {
                f[i][j]=f[i-1][j];    
                g[i][j]=g[i-1][j];
                if(a[i]==b[j]&&f[i-1][t]+1>f[i][j]) {  
                    f[i][j]=f[i-1][t]+1;
                    g[i][j]=t;  
                }
                if(b[j]<a[i]&&f[i-1][j]>f[i-1][t])
                    t=j;
            }
        for(int i=1;i<=m;++i)
            if(f[n][i]>f[n][p])
                p=i;
        printf("%d
    ",f[n][p]);
        Print(p);
        return 0;
    }
    
  • 相关阅读:
    访问修饰符的权限。
    字符编码
    3/11 作业
    3/10 作业
    作业 3/9
    流程控制之for循环
    Exception in createBlockOutputStream
    windows上传文件到 linux的hdfs
    win10 配置 hadoop-2.7.2
    hadoop 源码编译
  • 原文地址:https://www.cnblogs.com/Kv-Stalin/p/9936913.html
Copyright © 2020-2023  润新知