HD 2048 数塔 DP(简单递推)
生活随笔
收集整理的這篇文章主要介紹了
HD 2048 数塔 DP(简单递推)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2084
Problem Description 在講述DP算法的時(shí)候,一個(gè)經(jīng)典的例子就是數(shù)塔問(wèn)題,它是這樣描述的:
有如下所示的數(shù)塔,要求從頂層走到底層,若每一步只能走到相鄰的結(jié)點(diǎn),則經(jīng)過(guò)的結(jié)點(diǎn)的數(shù)字之和最大是多少?
已經(jīng)告訴你了,這是個(gè)DP的題目,你能AC嗎?
Input 輸入數(shù)據(jù)首先包括一個(gè)整數(shù)C,表示測(cè)試實(shí)例的個(gè)數(shù),每個(gè)測(cè)試實(shí)例的第一行是一個(gè)整數(shù)N(1 <= N <= 100),表示數(shù)塔的高度,接下來(lái)用N行數(shù)字表示數(shù)塔,其中第i行有個(gè)i個(gè)整數(shù),且所有的整數(shù)均在區(qū)間[0,99]內(nèi)。
Output 對(duì)于每個(gè)測(cè)試實(shí)例,輸出可能得到的最大和,每個(gè)實(shí)例的輸出占一行。
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算法的時(shí)候,一個(gè)經(jīng)典的例子就是數(shù)塔問(wèn)題,它是這樣描述的:
有如下所示的數(shù)塔,要求從頂層走到底層,若每一步只能走到相鄰的結(jié)點(diǎn),則經(jīng)過(guò)的結(jié)點(diǎn)的數(shù)字之和最大是多少?
已經(jīng)告訴你了,這是個(gè)DP的題目,你能AC嗎?
Input 輸入數(shù)據(jù)首先包括一個(gè)整數(shù)C,表示測(cè)試實(shí)例的個(gè)數(shù),每個(gè)測(cè)試實(shí)例的第一行是一個(gè)整數(shù)N(1 <= N <= 100),表示數(shù)塔的高度,接下來(lái)用N行數(shù)字表示數(shù)塔,其中第i行有個(gè)i個(gè)整數(shù),且所有的整數(shù)均在區(qū)間[0,99]內(nèi)。
Output 對(duì)于每個(gè)測(cè)試實(shí)例,輸出可能得到的最大和,每個(gè)實(shí)例的輸出占一行。
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; }
總結(jié)
以上是生活随笔為你收集整理的HD 2048 数塔 DP(简单递推)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HD 1176 免费馅饼 (DP)
- 下一篇: HD 2044 一只小蜜蜂(递推)