【模板】 数字三角形

传送门

题意

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5

数据范围

\(\begin{array}{l}1 \leq n \leq 500 \\ -10000 \leq g_{ij} \leq 10000\end{array}\)

题解

在数组中存储的如下

7
3   8
8   1   0
2   7   4   4
4   5   2   6   5
  • \(dp[i][j]\)表示走到\((i,j)\)的最大路径和
  • 转数组中后的状态转移方程为\(dp[i][j] = max(dp[i-1][j-1] + a[i][j],dp[i-1][j]+a[i][j])\)
    • \((i-1,j-1)\)表示从左上角转移过来的
    • \((i-1,j)\)表示从哪右上角转移过来的
  • 因为数字可能是负数,并且要转移过来的才合法,所以要初始化为\(-INF\)

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
const int N=510;
int dp[N][N],a[N][N];
int n,INF=0x3f3f3f3f;
int main(){
    cin>>n;
   
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
            cin>>a[i][j];
    memset(dp,-0x3f,sizeof dp);
            
    dp[1][1]=a[1][1];
    rep(i,2,n+1)
        rep(j,1,i+1)
            dp[i][j]=max(dp[i-1][j-1]+a[i][j],dp[i-1][j]+a[i][j]);
        
    int ans=-INF;
    for(int i=1;i<=n;i++)
    res=max(res,dp[n][i]);
   
    cout<<ans<<endl;
}

posted @ 2020-01-23 11:12  Hyx'  阅读(81)  评论(0)    收藏  举报