數塔(2084)

*在講述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
DP
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <list> 
#include <map> 
#include <string>
using namespace std; 
#define infinity 2147483647
#define pi 3.1415926535898
#define g 9.81
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
int maxx(int a,int b)
{
	return a>=b?a:b;
}
int s[100][100],dp[100][100]; 
int main()
{
	int i,j,c,n;
	while(scanf("%d",&c)!=EOF)
	{
		while(c--)
		{
			cin >>n;
			for(i=0;i<n;i++)
			{
				for(j=0;j<=i;j++)
				{
					cin >>s[i][j];
				}
			}
			for(i=0;i<n;i++)
			{
				dp[n-1][i]=s[n-1][i];
			}
			for(i=n-2;i>=0;i--)
			{
				for(j=0;j<=i;j++)
				{
					dp[i][j]=s[i][j]+maxx(dp[i+1][j],dp[i+1][j+1]);
				}
			}
			cout <<dp[0][0] <<endl;								
		}
	}			
		
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章