数塔(HDU-2084)
生活随笔
收集整理的這篇文章主要介紹了
数塔(HDU-2084)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Problem Description
? ??在講述DP算法的時(shí)候,一個(gè)經(jīng)典的例子就是數(shù)塔問題,它是這樣描述的:
????有如下所示的數(shù)塔,要求從頂層走到底層,若每一步只能走到相鄰的結(jié)點(diǎn),則經(jīng)過的結(jié)點(diǎn)的數(shù)字之和最大是多少?
????已經(jīng)告訴你了,這是個(gè)DP的題目,你能AC嗎?
Input
? ? 輸入數(shù)據(jù)首先包括一個(gè)整數(shù)C,表示測試實(shí)例的個(gè)數(shù),每個(gè)測試實(shí)例的第一行是一個(gè)整數(shù)N(1 <= N <= 100),表示數(shù)塔的高度,接下來用N行數(shù)字表示數(shù)塔,其中第i行有個(gè)i個(gè)整數(shù),且所有的整數(shù)均在區(qū)間[0,99]內(nèi)。
Output
? ? 對于每個(gè)測試實(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
?
思路:
設(shè):dp[i][j]為第i行第j列的最大和
則:
- 狀態(tài)轉(zhuǎn)移方程:dp[i][j]=max(dp[i-1][j-1],f[i-1][j])+num[i][j];
- 邊界條件:dp[1][1]=dp[1][1]
記得在最后一行尋找最大值即可
Source Program
#include<iostream> #include<cstring> #define N 101 using namespace std;int num[N][N]; int dp[N][N];int main() {int c,n;int i,j;cin>>c;while(c--){memset(dp,0,sizeof(dp));/*初始化*/cin>>n;for(i=1;i<=n;i++)for(j=1;j<=i;j++)cin>>num[i][j];dp[1][1]=num[1][1];/*邊界條件*/for(i=2;i<=n;i++)for(j=1;j<=i;j++)dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+num[i][j];//狀態(tài)方程int maxx=-99999999;for(i=1;i<=n;i++)//尋找最后一行最大值maxx=max(maxx,dp[n][i]);cout<<maxx<<endl;} }?
總結(jié)
以上是生活随笔為你收集整理的数塔(HDU-2084)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连连看(HDU-1175)
- 下一篇: 基础算法 —— 排序算法