hiho第五周--数字三角形

来源:互联网 发布:linux stat 文件夹 编辑:程序博客网 时间:2024/06/08 18:08

数字三角形是最基础的DP问题

原题链接

数字三角形最好理解的就是从最低层往上走,走到顶时能够达到的最大值。对于每个位置(i, j)可以从(i + 1, j)和( i + 1, j + 1)两个位置到达,易知应当选择其中的大者。

定义状态:d(i,j)为从第i层j列出发到数字三角形最下层能达到的最大值
状态转移方程:d(i,j) = max( d(i + 1, j), d(i + 1, j + 1)) + a[i][j]

边界处理:最底层d(n, i)= a[n][i]

#include <cstdio>#include <algorithm>#define maxn 105using namespace std;int a[maxn][maxn], d[maxn]; // a数组保存数字三角形, d数组用于保存状态int main(){    int n;    scanf( "%d", &n);    for ( int i = 1; i <= n; i++){        for ( int j = 1; j <= i; j++){            scanf( "%d", &a[i][j]);        }    }    for ( int i = 1; i <= n; i++){        d[i] = a[n][i];                 // 边界处理,采用逆推    }    for ( int i = n - 1; i >= 1; i--){        for ( int j = 1; j <= i; j++){            d[j] = max( d[j], d[j + 1]) + a[i][j];    // 采用滚动数组,节省空间,但要注意递推顺序        }    }    printf( "%d\n", d[1]);    return 0;}


0 0