HD 2048 数塔 DP(简单递推)
生活随笔
收集整理的這篇文章主要介紹了
HD 2048 数塔 DP(简单递推)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2084
Problem Description 在講述DP算法的時候,一個經典的例子就是數塔問題,它是這樣描述的:
有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?
已經告訴你了,這是個DP的題目,你能AC嗎?
Input 輸入數據首先包括一個整數C,表示測試實例的個數,每個測試實例的第一行是一個整數N(1 <= N <= 100),表示數塔的高度,接下來用N行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間[0,99]內。
Output 對于每個測試實例,輸出可能得到的最大和,每個實例的輸出占一行。
Sample Input 1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output 30
Problem Description 在講述DP算法的時候,一個經典的例子就是數塔問題,它是這樣描述的:
有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?
已經告訴你了,這是個DP的題目,你能AC嗎?
Input 輸入數據首先包括一個整數C,表示測試實例的個數,每個測試實例的第一行是一個整數N(1 <= N <= 100),表示數塔的高度,接下來用N行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間[0,99]內。
Output 對于每個測試實例,輸出可能得到的最大和,每個實例的輸出占一行。
Sample Input 1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output 30
?
從下往上遞推 遞推公式為:d[i][j]=MAX(d[i+1][j],d[i+1][j+1])+d[i][j];
如下代碼:
#include<cstdio> #define N 100+10int d[N][N]; int maxn(int x, int y){return (x>y) ? x : y; }int main(){int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=1; i<=n; ++i){for(int j=1; j<=i; ++j){scanf("%d",&d[i][j]);}}for(int i=n-1; i>=1; --i){for(int j=1; j<=i; ++j){d[i][j]=maxn(d[i+1][j],d[i+1][j+1])+d[i][j];}}printf("%d\n",d[1][1]); } return 0; }
總結
以上是生活随笔為你收集整理的HD 2048 数塔 DP(简单递推)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HD 1176 免费馅饼 (DP)
- 下一篇: HD 2044 一只小蜜蜂(递推)