【每周一題】2017.3.20 HDU2084 解題報告

題目描述

  • 在講述DP算法的時候,一個經(jīng)典的例子就是數(shù)塔問題,它是這樣描述的:
  • 有如下所示的數(shù)塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經(jīng)過的結點的數(shù)字之和最大是多少?
  • (這里有一張圖,你看不見我)
  • 已經(jīng)告訴你了,這是個DP的題目,你能AC嗎?
  • 可以把代碼提交至這里:http://acm.hdu.edu.cn/showproblem.php?pid=2084

解題分析

  • 這次的題目就不再詳解了,只給出狀態(tài)轉移方程:
f[i, j] = max(f[i - 1, j - 1], f[i - 1, j]) + a[i, j] 
  • 其中f[i,j]表示走到第i行第j個數(shù)時的當前最大和,a[i,j]表示第i行第j個數(shù)字的值。

例程(C++)

(注:例程只是給出一種解題方法,不是標準程序,也不一定是最完美的解法)

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    //狀態(tài)轉移方程: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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容