1. 程式人生 > >hdu 2084數塔問題

hdu 2084數塔問題

數塔

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20246    Accepted Submission(s): 12139


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
Source DP經典入門題,24k純水,不多說,直接上程式碼
/*從下往上,先求出倒數第二層到倒數第一層的最優解,將5層的數塔降為4層的數塔,
再依次類推,最後的a[1][1]即為最優解*/

#include<stdio.h>
int main()
{
	int a[200][200],i,j,t,n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=i;j++)
			{
				scanf("%d",&a[i][j]);
			}
		}

               //輸入數塔

		for(i=n-1;i>=1;i--)
		{
			for(j=1;j<=i;j++)
			{
				if(a[i+1][j]>=a[i+1][j+1])
				{
					a[i][j]+=a[i+1][j];
				}
				else 
				a[i][j]+=a[i+1][j+1];
			}
		}


                /*例如,當i為4時,第四層變為
                a[4][1]+=max(a[5][1]+a[5][2]); a[4][2]+=max(a[5][2]+a[5][3]);
                a[4][3]+=max(a[5][3]+a[5][4]); a[4][4]+=max(a[5][4]+a[5][5]);
                這樣就變成了4層的數塔,再一直往上,直到最後變成一層,這時的a[1][1]便是最優解*/


		printf("%d\n",a[1][1]);
	}
return 0;
}



相關推薦

HDU 2084 簡單動態規劃

動態 src 2-2 code .cn clas return 技術分享 space 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 題目大意:有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的

hdu 2084 dp 動態規劃

lan 必須 次循環 AC 如果 sin set main turn 開始動態規劃的學習了,先是比較基礎的,很金典的數塔。附上題目鏈接 http://acm.hdu.edu.cn/showproblem.php?pid=2084 這題的狀態轉移方程是 dp[i][

[遞推簡單dp]-hdu 2084

[遞推簡單dp]-hdu 2084 數塔 標籤: ACM 題意: 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 已經告訴你了,這是個

hdu--2084 (dp類題目)

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2084 題意:我最開始以為是搜尋,想從下往上推,結果明顯不行(方案太多了),暴力肯定也是行不通的,所以千思萬想應該從下往上推。 核心方程:a[i][j]=max(a[i][j]+a[i

hdu 2084 (dp)

很簡單的dp問題。 以下附上ac程式碼 #include<iostream> #include<cmath> #include<cstring> # define max(a,b) ((a)>(b)?(a):(b))//

hdu 2084 (DP)

Problem Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 已經告訴你了,這是個DP的題目,你能AC嗎? Input

HUD 1257 最少攔截系統 / HDU 2084 (DP)

這個星期進入DP專題。 先是基本概念。。(摘抄課件,我自重= =) 動態規劃(Dynamic Programming, DP)是解決某一類問題的一種方法,是分析問題的一種途徑,而不是一種特殊演算法(如線性規劃是一種演算法)。因此,在學習動態規劃時,除了對基本概念和方法正確地理解外,應以豐富的想象力去建

HDU 2084 問題(動態規劃入門)

Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的:  有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?  已經告訴你了,這是個DP的題目,你能AC嗎? Input 輸入資

hdu 2084問題

數塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 20246    Accepted Submission(

HDU 2084 問題

DP演算法的經典例子 數塔問題 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? #include<stdio.h> #include<iostream> using namespace std

HDU 2084 dp

數塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 43433    Accepted Submissio

Hdoj 2084. 題解

Problem Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 已經告訴你了,這是個DP的題目,你能AC嗎? Input 輸入資料首先包括一個整數C,表示

【杭電100題】【DP_動態規劃】2084

Problem Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 已經告訴你了,這是個DP的題目,你能AC嗎? Input 輸入資料首先包括一

hd 2084 (dp)

 原題連結 #include<stdio.h> int main() { int a[110][110],t,n,i,j; while(scanf("%d",&t)!=EOF) { while(t--) {

hdoj——2084

在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 已經告訴你了,這是個DP的題目,你能AC嗎? Input 輸入資料首先包括一個

2084 (dp入門)

數塔 Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的:  有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和

問題-hdu-2084(dp)

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2084 思路:要求從頂到底的最大值,可以反過來考慮,從底部向上。 只有下面一行的最大值確定,這一行的最大值才能確定。 #include<iostream> #include<cstdi

HDU 2084——(動態規劃)

思路:從上往下推,數越來越多,結果狀態太多,不好處理;則由下往上推,越往上數越少,最終歸於一個數。 狀態方程:dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j]; C++程式碼實現: #include<stdio.

Re0:DP學習之路 HDU - 2084(基礎遞推)

解法 首先是輸入的問題,輸入的時候還要注意每一層都有多少個 然後是怎麼求解,一般求解首先要考慮順序,是正序還是倒序 如果這個題是正序的話那麼最終還需要將最後一行進行一次找max的運算 如果是倒序的話那麼最終歸於同一個起點,直接進行輸出即可 轉移方程 轉移方程考慮把問題分散化,分散成小的問題,其中這

動態規劃:問題 hdu 2084 dp

帶備忘錄的自頂向下: #include<iostream> #include<cstring> using namespace std; int tower[101][101