數塔
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 70827 Accepted Submission(s): 40998
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
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n , m ;
int map [110][110];
cin >> n;
while ( n-- ){
cin>>m ;
for ( int i = 0 ; i < m ; i++){
for ( int j = 0 ; j < i+1 ; j ++){
cin >> map [i][j];
}
}
/*從下向上掃描,每次對比拿到最大的部分,最後得到整體最大*/
for(int i = m-2 ; i >= 0 ; i --){//從倒數第二行開始掃描,最後一行開始掃描會掃描到多餘的部分
for ( int j = 0 ; j < i+1 ; j++){
/*判斷出當前最大值*/
map [i][j] = max(map[i+1][j],map[i+1][j+1]) + map [i][j];
}
}
cout<< map[0][0] << endl;
}
return 0 ;
}