测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A18714. 数字三角形

填空题 困难

题目描述

数字三角形

题目描述

给出一个数字三角形,从顶端出发,每一步只能向左下方、右下方移动,求走到最底层的路径数字总和最大值。

样例三角形结构:

      7
    3   8
  8   1   0
2   7   4   4

输入格式

第一行为层数r;接下来r行依次输入三角形每行数据

输出格式

路径最大总和

样例输入

4
7
3 8
8 1 0
2 7 4 4

样例输出

30

要求:使用自顶向下二维DP,禁止贪心、自底向上写法


参考答案

#include <iostream> #include <algorithm> using namespace std; int a[55][55],dp[55][55]; int main(){ int r; cin>>r; for(int i=1;i<=r;i++) for(int j=1;j<=i;j++) cin>>a[i][j]; dp[1][1]=a[1][1]; for(int i=2;i<=r;i++){ dp[i][1]=dp[i-1][1]+a[i][1]; dp[i][i]=dp[i-1][i-1]+a[i][i]; for(int j=2;j<i;j++){ dp[i][j]=a[i][j]+max(dp[i-1][j],dp[i-1][j-1]); } } int ans=0; for(int j=1;j<=r;j++) ans=max(ans,dp[r][j]); cout<<ans; return 0; }

答案解析

DP四要素:

状态:dp[i][j] 走到第i行第j列的路径最大总和

初值:dp[1][1]=a[1][1];每行最左/最右单独初始化

转移:$$dp[i][j] = a[i][j] + \max(dp[i-1][j],dp[i-1][j-1])$$

顺序:行从上到下,列从左到右

上一题 下一题