1. 程式人生 > >動態規劃__數字三角形

動態規劃__數字三角形

寫了這麼久程式,總是卡在動態規劃,這次,準備集中攻克一下

        如果我們能夠儲存已解決的子問題的答案,而在需要時簡單查一下,這樣我們就可以避免大量的重複計算,從而得到多項式時間的演算法。

        為了實現上述演算法,我們用一個數組來記錄所有已解決的子問題的答案,無論子問題以後是否被用到,只要它被計算過,就將其存入陣列中,這種方法在程式設計中被稱為動態規劃

由淺到難進行攻克,選擇【牛客網——數字三角形】作為第一題。同時也是IOI’94年的題

【題目描述】

如下所示為一個數字三角形:

7
3  8
8  1  0
2  7  4  4
4  5  2  6  5

請編一個程式計算從頂到底的某處的一條路徑,使該路徑所經過的數字的總和最大

每一步可沿直線向下或右斜線向下走。

1<三角形行數≤100

三角形中的數字為整數0,1,。。。,99

【輸入描述】

輸入包含多組。每組資料的第一行包含一個正整數n(1≤n≤100),代表三角形的層數。
緊接著有n行數字,第i(1≤i≤n)行包含i個自然數。

【輸出描述】

對應每組資料,輸出最大的和。

看到了題目要求是會輸入多組,哎。。。。怎麼輸入多組呢?

C++解決方法:

int n;

while (cin >> n)

{

    //執行的方法

}

JAVA解決方法:

Scanner sc=new Scanner(System.in);

while(sc.hasNext()) {

    int n = sc.nextInt();

    //執行的方法

}

分析:

由於某個點只可能走到它的下方或斜下方(如圖8向下到2,向斜下到7)。也可以這麼看,7只能由81到達。

7

3   8
8  1  0


2
  7  4   4
4   5   2   6   5

因此,最優路徑必定與其左上方正上方兩個位置的最優路徑有關。(7的最優路徑必定於81的最優路徑有關)

用二維陣列a來記錄數字三角形中的數,a[ i , j ]表示數字三角形中第i行的第j個數。

用二維陣列m記錄每個位置的最優路徑的數字總和。

計算陣列m用逐行遞推的方法實現。

關鍵公式:m[ i , j ] = a[ i , j ] + max{ m[ i+1 , j ] , m[ i+1 ,j+1]}

例:

a[ 2 , 0] = 8

a[ 3 , 0] = 2  a[ 3 , 1 ] = 7

m[ 2 , 0] = a[2 , 0 ] + max{ m[ 3 , 0 ] , m[ 3 , 1 ]}

JAVA程式碼:

import java.util.Arrays;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		int n;//行數
		int[][] a;//存放三角形
		int[][] m;//存放運算結果
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext())
		{
			
			n = sc.nextInt();
			a = new int[n][n];
			m = new int[n][n];
			for (int i7=0;i7<n;i7++)
			Arrays.fill(m[i7], 0);
			for(int i1=0;i1<n;i1++)
			{
				for(int i2=0;i2<=i1;i2++)
				{
					a[i1][i2]=sc.nextInt();
				}
			}
			for(int i3=0;i3<n;i3++)
			{
				m[n-1][i3] = a[n-1][i3];
			}
			if(n>1)
			{
				for(int i=n-2;i>=0;i--)
				{
					for(int j=0;j<=i;j++)
					{
						if(m[i+1][j]>m[i+1][j+1])
						{
							m[i][j]=a[i][j]+m[i+1][j];
						}
						else
						{
							m[i][j]=a[i][j]+m[i+1][j+1];
						}
					}
				}
			}
			System.out.println(m[0][0]);
		}
		
	}

}

相關推薦

動態規劃__數字三角形

寫了這麼久程式,總是卡在動態規劃,這次,準備集中攻克一下        如果我們能夠儲存已解決的子問題的答案,而在需要時簡單查一下,這樣我們就可以避免大量的重複計算,從而得到多項式時間的演算法。        為了實現上述演算法,我們用一個數組來記錄所有已解決的子問題的答案,

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

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

動態規劃_數字三角形

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

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

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

6.1 動態規劃數字三角形

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

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

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

動態規劃數字三角形最大值(一)(遞迴)

題目:數字三角形,形如          3      3      2   4     5     1 1    3     4     1 每個點只能選擇向左或向右走,取一條路徑,使得路徑上數字和最大。 無需求出路徑,求出最大值。 輸入n,和 n 行數字三角形 n<

動態規劃數字三角形問題

Description 給定一個由n行數字組成的數字三角形如下圖所示。試設計一個演算法,對於給定的由 n行數字組成的數字三角形, 計算從三角形的頂至底的路徑經過的數字和的最大值。 注意:對於第i層的第j個數字,其所在路徑的下一個數字只能是第i+1層的第j個或第j+1

動態規劃——求數字三角形最優解和最優路徑

給定一個由n行數字組成的數字三角形如下圖所示。試設計一個演算法,對於給定的由 n行數字組成的數字三角形, 計算從三角形的頂至底的路徑經過的數字和的最大值。 注意:對於第i層的第j個數字,其所在路徑的下一個數字只能是第i+1層的第j個或第j+1個數字。

動態規劃練習一 三角形最佳路徑問題

描述 如下所示的由正整數數字構成的三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到一個和,和最大的路徑稱為最佳路徑。你的任務就是求出最佳路徑上的數字之和。

動態規劃練習--21(三角形最佳路徑問題)

題目描述: 描述 如下所示的由正整數數字構成的三角形:  7  3 8  8 1 0  2 7 4 4  4 5 2 6 5  從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到一個和,和最大的路徑稱為最佳路徑。你的任務就是求出最佳路徑

動態規劃 LeetCode 120.三角形的最小路徑和

題目描述 給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。 例如,給定三角形 [ [2], [3,4], [6,5,7], [4,1

動態規劃練習21:三角形最佳路徑問題

題目簡要: 描述 如下所示的由正整數數字構成的三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到一個和,和最大的路徑稱為最佳路徑。你的任務就是求出最佳路徑上的

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

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

動態規劃——數字三角形

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

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

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

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

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

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

有一個由非負整陣列成的三角形,第一行只有一個數,除了最下行之外每個數的左下方和右下方各有一個數.     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

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

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