动态规划——数塔问题

来源:互联网 发布:照片换服装软件下载 编辑:程序博客网 时间:2024/05/24 01:46

从上到下出发,每次只能走到下面相邻的节点,寻找一条路径使经过的数值和最大。

9

12  15

10   6  8

 2   18  9  5

19   7  10  4  15

动态规划思路:假设到第i行第j个元素为止的最优解为f[i][j],则f[i][j]实际上至于f[i-1][j]和f[i-1][j-1]有关。

#include <iostream>#include <cstdio>using namespace std;const int N = 100;// 下面这个函数实现的是更新最大值,o赋值为o和x的最大值template <class T>void updateMax(T& o, const T& x) {    o = (o > x) ? o : x;}// f数组为动态规划的状态数组// num数组为读入的数塔// n为读入的数塔高度int f[N][N], num[N][N], n;int main() {    // 读入n和数塔数组num    scanf("%d", &n);    for (int i = 1; i <= n; ++i) {        for (int j = 1; j <= i; ++j) {            scanf("%d", &num[i][j]);        }    }    // 在这里实现动态规划算法逻辑    for (int i = 1; i <= n; ++i) {        for (int j = 1; j <= i; ++j){            updateMax(f[i][j], max(f[i-1][j],f[i-1][j-1])+num[i][j]);        }    }    // 定义最终结果变量result,因为是计算最大值,所以初始化为0    int result = 0;    for (int i = 1; i <= n; ++i) {        updateMax(result, f[n][i]);    }    // 输出最终最大权值和result    printf("%d\n", result);    return 0;}
From 计蒜客

0 0