【每周一题】2017.3.20 HDU2084 解题报告

题目描述

  • 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:
  • 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
  • (这里有一张图,你看不见我)
  • 已经告诉你了,这是个DP的题目,你能AC吗?
  • 可以把代码提交至这里:http://acm.hdu.edu.cn/showproblem.php?pid=2084

解题分析

  • 这次的题目就不再详解了,只给出状态转移方程:
f[i, j] = max(f[i - 1, j - 1], f[i - 1, j]) + a[i, j] 
  • 其中f[i,j]表示走到第i行第j个数时的当前最大和,a[i,j]表示第i行第j个数字的值。

例程(C++)

(注:例程只是给出一种解题方法,不是标准程序,也不一定是最完美的解法)

#include 
#include 
using namespace std;

int main()
{
    //状态转移方程:f[i, j] = max(f[i - 1, j - 1], f[i - 1, j]) + a[i, j] 
    int totalCase = 0;
    cin >> totalCase;
    while (totalCase--)
    {
        int N;
        int a[128][128], f[128][128];
        
        cin >> N;
        memset(f, 0, sizeof(f));
        cin >> a[1][1];
        f[1][1] = a[1][1];
        int maxValue = f[1][1];
        for (int i = 2; i <= N; i++)
            for (int j = 1; j <= i; j++)
            {
                cin >> a[i][j];
                f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + a[i][j];
                if (maxValue < f[i][j])maxValue = f[i][j];
            }
        cout << maxValue << endl;
    }
    return 0;
}

你可能感兴趣的:(【每周一题】2017.3.20 HDU2084 解题报告)