zoukankan      html  css  js  c++  java
  • 898. 数字三角形

    经典dp问题

    自上向下dp

    数字三角形updown.PNG

    #include<iostream>
    #include<cstring>
    
    using namespace std;
    
    const int N = 510, INF = 0x3f3f3f3f;
    int f[N][N], a[N][N];
    int n;
    
    int main(){
        memset(f, 128, sizeof f);
        
        cin >> n;
        
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= i; j ++)
                cin >> a[i][j];
                
        f[1][1] = a[1][1];
        
        for(int i = 2; i <= n; i ++)
            for(int j = 1; j <= i; j ++)
                f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + a[i][j];
        
        int res = -INF;
        for(int i = 1; i <= n; i ++) res = max(res, f[n][i]);
        
        cout << res;
        
        return 0;
    }
    

    自下向上dp

    数字三角形downup.PNG

    #include<iostream>
    #include<cstring>
    
    using namespace std;
    
    const int N = 510;
    int f[N][N], a[N][N];
    int n;
    
    int main(){
        cin >> n;
        
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= i; j ++)
                cin >> a[i][j];
            
        for(int i = n; i >= 0; i --) f[n][i] = a[n][i];
        
        for(int i = n - 1; i >= 1; i --)
            for(int j = 1; j <= i; j ++)
                f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j];
        
        cout << f[1][1];
        
        return 0;
    }
    

    记忆化搜索

    #include<iostream>
    #include<cstring>
    
    using namespace std;
    
    const int N = 510;
    int f[N][N], a[N][N], st[N][N];
    int n;
    
    int dfs(int x, int y){
        
        if(x == n) return a[x][y];
        
        if(!st[x][y]){
            st[x][y] = 1;
            f[x][y] = max(dfs(x + 1, y), dfs(x + 1, y + 1)) + a[x][y];
        }
        
        return f[x][y];
    }
    
    int main(){
        // memset(f, 128, sizeof f);
        
        cin >> n;
        
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= i; j ++)
                cin >> a[i][j];
                
                
        cout << dfs(1, 1);
        
        return 0;
    }
    
  • 相关阅读:
    Python-枚举
    Python-函数
    Python-装饰器(语法糖)上下五千年和前世今生
    Python-全局函数(内置方法、内置函数)
    Python-时间模块-time
    Python-随机模块-random
    Python-维护排序好的序列模块-bisect
    需求推动技术的产生
    RBF神经网络
    聚类算法的衡量指标
  • 原文地址:https://www.cnblogs.com/tomori/p/13623336.html
Copyright © 2011-2022 走看看