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;
    }
    
  • 相关阅读:
    逻辑架构设计目标和任务
    业务架构设计
    架构设计概念
    可扩展设计:如何做到增加功能不修改调用方代码?
    P2661 信息传递
    Network of Schools POJ
    1002 过河卒
    P3254 圆桌问题
    P2765 魔术球问题
    P1141 01迷宫
  • 原文地址:https://www.cnblogs.com/tomori/p/13623336.html
Copyright © 2011-2022 走看看