zoukankan      html  css  js  c++  java
  • 272. 最长公共上升子序列(动态规划)

     方法一:O(n3)

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 3030;
    int a[N], b[N], f[N][N];
    int n;
    
    int main() {
        scanf("%d",&n);
        for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
        for(int i = 1; i <= n; i++) scanf("%d",&b[i]);
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                f[i][j] = f[i-1][j];
                if(a[i] == b[j]) {
                    int max1 = 1;
                    for(int k = 1; k < j; k++) {
                        if(a[i] > b[k]) max1 = max(max1,f[i-1][k] + 1);
                    }
                    f[i][j] = max1;
                }
            }
        }
        int res = 0;
        for(int i = 1; i <= n; i++) res = max(res,f[n][i]);
        cout << res << endl;
        return 0;
    } 

    方法二O(n2)

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 3030;
    int a[N], b[N], f[N][N];
    int n;
    
    int main() {
        scanf("%d",&n);
        for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
        for(int i = 1; i <= n; i++) scanf("%d",&b[i]);
        for(int i = 1; i <= n; i++) {
            int maxv = 1;
            for(int j = 1; j <= n; j++) {
                f[i][j] = f[i-1][j];
                if(a[i] == b[j]) f[i][j] = max(f[i][j],maxv);
                if(a[i] > b[j]) maxv = max(maxv,f[i][j] + 1);
            }
        }
        int res = 0;
        for(int i = 1; i <= n; i++) res = max(res,f[n][i]);
        cout << res << endl;
        return 0;
    } 
  • 相关阅读:
    将iso镜像转换为docker镜像
    Linux awk使用方法~~整理
    Linux sed使用方法
    Linux 环境变量梳理
    学习docker——命令总结
    Golang 字符串操作--使用strings、strconv包
    WebSocket实现一个聊天室
    学习WebSocket
    PHP面试题整理
    php使用gd库输出中文内容的图片
  • 原文地址:https://www.cnblogs.com/yonezu/p/13704131.html
Copyright © 2011-2022 走看看