线性dp入门经典题——数字三角形——AcWing

题目链接
https://www.acwing.com/problem/content/900/
思路
闫氏dp法:

所以状态转移方程就是f [ i ] [ j ] = max(f [ i - 1 ][ j - 1 ] , f [ i - 1 ][ j ]) + a [ i ] [ j ] 。
需要注意的是在初始化dp数组的时候要多处理一列,因为处于边界的值会访问边界外的值。

c++代码

#include<bits/stdc++.h>
using namespace std;
const int N=510;
const int INF=-1e7;

int a[N][N],n,f[N][N];

int main()
{
    
    
    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=0;i<=n;i++)
    {
    
    
        for(int j=0;j<=i+1;j++)
        {
    
    
            f[i][j]=INF;
        }
    }
    
    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 MAX=INF;
    for(int i=1;i<=n;i++)
    {
    
    
        MAX=max(MAX,f[n][i]);
    }
    printf("%d\n",MAX);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Star_Platinum14/article/details/112548078
今日推荐