1. 程式人生 > >數字三角形問題 (動態規劃初步)

數字三角形問題 (動態規劃初步)

問題描述:

有一個由非負整陣列成的三角形,第一行只有一個數,除了最下行之外每個數的左下方和右下方各有一個數。

   從第一行的數開始,每次可以往左下或右下走一格,直到走到最下行,把沿途經過的數全部加起來。如何走才能使得這個和儘量大?

如下圖:

             1

          3   2

       4  10  1

    4   3   2   20

思考:把當前的位置(i,j)看成一個狀態,然後定義狀態(i,j)的指示函式d(i,j)為從格子(i,j)出發時能得到的最大和(包括格子(i,j)本身的值)。在這個狀態定義下,原問題的解釋d(1,1)。

狀態狀態轉移:從格子(i,j)出發有兩種決策。如果往左走,則走到(i+1,j)後需要求”從(i+1,j)出發後能得到的最大和”這一問題,即d(i+1,j)。類似的,往右走之後需要求解d(i+1,j+1)。

所以狀態轉移方程就是d(i,j)=max{d(i+1,j),d(i+1,j+1)}+a(i,j);

方法一:遞推計算 (時間複雜度為O(n^2))

int i,j;
for(i=1; i<=n; ++i)	//下標從1開始 
	d[n][i]=a[n][i];
for(i=n-1; i>=1; --i){
	for(j=1; j<=i; ++j)
		d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);
}

因為i是列舉的,因此在計算 d[i][j] 前,它所需要的d[i+1][j]和d[i+1][j+1]一定已經計算出來了

方法二:記憶化搜尋(時間複雜度O(n^2)  首先memset(d,-1,sizeof(d))  將d全部初始化為-1

int solve(int i, int j){
	if(d[i][j]>0)	return d[i][j];
	return d[i][j] = a[i][j] + ( i==n ? 0 : max(solve(i+1, j), solve(i+1, j+1) ) );
}

題目中各個數都是非負的,這樣只需要把d初始化為-1,即可通過判斷是否d[i][j]>=0得知它是否已經被計算過。

相關推薦

poj1163 數字三角形 (動態規劃)

試題連結:http://poj.org/problem?id=1163 1.記憶遞迴型(自頂向下) D[i][j]來存數字 典型的遞迴問題:D(r,j)出發,下一步只能走D(r+1,j)或者D(r+1

動態規劃初步 劉汝佳字數 數字三角形

有一個由非負整陣列成的三角形,第一行只有一個數,除了最下行之外每個數左下方和右下方各有一個數 如圖所示   從第一行的數開始,每次可以往左下或右下走一格,直到走到最下行,把沿途經過的數全部加起來,如何走才能使得這個和最大? 分析: 一看到題目我們很自然的可以想到用回溯法(DFS)做,即每次都

數字三角形問題 (動態規劃初步)

問題描述: 有一個由非負整陣列成的三角形,第一行只有一個數,除了最下行之外每個數的左下方和右下方各有一個數。    從第一行的數開始,每次可以往左下或右下走一格,直到走到最下行,把沿途經過的數全部加起

紫書第九章-----動態規劃初步數字三角形

本文參考劉汝佳《演算法競賽入門經典》(第2版) 動態規劃的核心是狀態和狀態轉移方程 數字三角形 OpenJ_Bailian - 2760 【分析】 狀態:d(i,j)表示從點(i,j)

紫書動態規劃初步題解——數字三角形問題

題目連結:數字三角形題目:數字三角形問題Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description給定一個由n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的

動態規劃初步

硬幣問題 coins 都是 image 計算 不同 alt mage http 湊錢問題: 題目:給一個總額amount,以及現有的錢幣面值數組coins,要求計算最少需要多少張coins中的錢幣才能湊出總額; 動態規劃是將大問題轉化為小問題,然後一步步求解出最終結果。

P1043 數字遊戲-動態規劃,區間dp

丁丁最近沉迷於一個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共n個),你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到一個數

數字三角形最小路徑和—動態規劃

div 路徑和 image 動態 節點 spa 直接 .cn 一行 思路:自底向上求解,從倒數第二行開始,本行節點到最後一行的最小路徑和等於該節點的數據加上下面左右兩個數據中最小的一個。不使用額外空間,直接將最小路徑和存儲到原有的數組中。1 int minimumTota

簡單的動態規劃數字三角形,以及做題思路。

數值 space 鏈接 分析 ios style iostream 循環 turn 鏈接 一句話題目:給出一個n層的三角形,每個位置有一個數字,到達後可獲得,求到達最低層能達到的最大數字和。 題目分析: 首先我們考慮能不能用搜索做,因為對於一個坐標,我們只有向下

動態規劃——數字三角形

-- 就是 程序 else 視頻 問題: 維數 技術 i+1 題目: (題目來源:中國大學Mooc,程序設計與算法(二)算法基礎視頻課程) 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的數字三角形中尋找一條從頂部到底邊的路徑

動態規劃_數字三角形

frame names atom arr sizeof org 維數 GC top 數字三角形案例 題目描述 Description 下圖給出了一個數字三角形,請編寫一個程序,計算從頂至底的某處的一條路徑,使該路徑所經過的數字的總和最大。 (1)每一步可沿左斜線向下或右斜

數字三角形 計算最大路徑 動態規劃

以所經過的權值之和最大值為例進行說明。 行進的過程中,每次只有兩種選擇:向左或向右。一個有n層的數字三角形的完整路徑有2n條,所以當n比較大的時候,搜尋全部路徑,從中找出最大值,效率較低。 採用動態規劃方法實現。 用d(i,j)表示從位置(i,j)出發時得到的最大值(包括位置(i,j)本

動態規劃-數字三角形問題

有一個由非負整陣列成的三角形,第一行只有一個數,除了最下行之外每個數的左下方和右下方各有一個數.     1    3 2  4 10 1 4 3 2 20 從第一行的數開始,每次可以往左下或右下走一格,直到走到最下

POJ1163數字三角形【簡單動態規劃

The Triangle  POJ - 1163  7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a prog

動態規劃實現數字三角形問題

 (1)題目描述如圖所示          (2)我們用上述矩陣分析:自頂向下分析入下圖二維矩陣所示   (3)我們從arr[2][0]開始分析,arr[2][0]是計算當前位置按照題中要求(每一條路徑只能往下或者右下走),可以得到arr[3][0]>arr[3][1],所以a

數字三角形問題(動態規劃)

最近在刷動態規劃類的題,刷紫書的259頁題 題目來源:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1730.html 數字三角形問題 Time Limit: 1000 ms

6.1 動態規劃數字三角形

在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得 路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或 右下走。只需要求出這個最大和即可,不必給出具體路徑。 輸入: 5 7  3 8 8 1 0 2 7 4 4 4 5 2 6 5 輸出: 30  解析:

【簡單】動態規劃數字三角形

例題一:數字三角形(POJ1163) The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8321 Accepted: 35029 Descri

演算法-動態規劃數字三角形

數字三角形問題 問題描述:給定一個由n行數字組成的數字三角形,如下圖 7 3 8 8 1 0

動態規劃 數字三角形

數字三角形 Poj 問題描述 上面給出了一個數字三角形。從三角形的頂部到底部有多條不同的路徑。對於每條路徑,把路徑上面的數字加起來可以得到一個和,累加和最大的路徑成為“最佳路徑”。題目的任務就是求出最佳路徑上的數字之和。 注意:路徑上的每一步只能從一個數走到下一層和它最近的左邊數或