首页 > 其他 > 详细

[复习资料.PDF]数字三角形(DP)

时间:2021-02-15 10:14:10      阅读:15      评论:0      收藏:0      [点我收藏+]

discription:
有一个层数为 n(n≤1000)的数字三角形(如下图)。现有一只蚂蚁从顶层开始向下走,每走
下一级时,可向左下方向或右下方向走。求走到底层后它所经过数字的总和的最大值, 并记录选取的路径。
1
6 3
8 2 6
2 1 6 5
3 2 4 7 6
最大和是23, 选取1 3 6 6 7.
solution:
\(f[i][j]\)为从点\((i,j)\)到底部的最大总和值, 则:
\(f[i][j]=max(f[i+1][j+1],f[i+1][j])+grid[i][j]\)
实现用逆推: 以层数\(i\)递减
记录每一步的选择, 可以打印最终的选择方案.\(bool型的g[i][j]\)表示点\((i,j)\)的来源,(取值1对应来自右下方向).
code:

#include<cstdio>
#include<iostream>
const int L = 1001;
using std::max;
int f[L][L], grid[L][L], n;
bool g[L][L];
void print_path(int x, int y) {
    if (x > n || y > n)return;
    printf("%d ", grid[x][y]);
    if (g[x][y])print_path(x + 1, y + 1);
    else print_path(x + 1, y);
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)for (int j = 1; j <= i; ++j)scanf("%d", grid[i] + j);
    for (int i = n; i; --i)for (int j = 1; j <= i; ++j) {
        if (f[i + 1][j + 1] >= f[i + 1][j])f[i][j] = f[i + 1][j + 1] + grid[i][j], g[i][j] = 1;
        else f[i][j] = f[i + 1][j] + grid[i][j];
    }
    printf("%d\n", f[1][1]);
    print_path(1, 1);
}

[复习资料.PDF]数字三角形(DP)

原文:https://www.cnblogs.com/dwt2021/p/14402202.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!