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

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

問題:

  給定一個由n行數字組成的數字三角形,如下圖所示:
              7 
           3   8 
         8   1   0 
      2   7   4   4 
   4   5   2   6   5 

  試設計一個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大(每一步只能從一個數走到下一層上和它最近的左邊的數或者右邊的數)。

輸入:

  第一行是數字三角形的行數,接下來 n 行是數字三角形中的數字。  

  比如:

  5

  7

  3  8

  8 1 0

  2 7 4 4

  4 5 2 6 5  

輸出:

  輸出這個最大值。

import java.util.Scanner;

public class Main {
	private static int[][] arr;
	
	public static int compare(int a,int b) {
		return a>b?a:b;
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		for(int k=0;k<n;k++) {
			int sum=sc.nextInt();
			arr=new int[sum][sum];
			for(int i=0;i<sum;i++)
				for(int j=0;j<=i;j++)//注意j<=i
					arr[i][j]=sc.nextInt();

		for(int i=arr.length-1;i>0;i--) {
			for(int j=i;j>0;j--) {
				int m=arr[i][j]+arr[i-1][j-1];
				int q=arr[i][j-1]+arr[i-1][j-1];
				arr[i-1][j-1]=compare(m,q);
			}
		}

		System.out.println(arr[0][0]);
		}
	}
}

for(int i=arr.length-1;i>0;i--) {
            for(int j=i;j>0;j--) {
                int m=arr[i][j]+arr[i-1][j-1];
                int q=arr[i][j-1]+arr[i-1][j-1];
                arr[i-1][j-1]=compare(m,q);
            }
        }

兩個for迴圈是這個題目的精髓。

自底向上地一行一行減少三角形的形狀,直到剩下最後一個數字。

4

6   5

m=4+5,q=6+4,讓m,q中較大的數替換4

相關推薦

三角形問題(動態規劃)

問題:   給定一個由n行數字組成的數字三角形,如下圖所示:               7             3   8           8   1   0        2   7   4   4     4   5   2   6   5    試設計一個

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][

NOIP2000方格取(洛谷,動態規劃遞推)

先上題目: P1004 方格取數   下面上ac程式碼: ///如果先走第一個再走第二個不可控因素太多 #include<bits/stdc++.h> #define ll long long using namespace std; ll f[11

(HDOJ)塔(動態規劃

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

藍橋杯-的劃分-動態規劃-java

問題描述   將整數n分成k份,且每份不能為空,任意兩份不能相同(不考慮順序)。   例如:n=7,k=3,下面三種分法被認為是相同的。   1,1,5; 1,5,1; 5,1,1;   問有多少種不同的分法。 輸入格式   n,k 輸出格式   一個整數,即不

hdoj problem2084 塔(動態規劃

數塔 http://acm.hdu.edu.cn/showproblem.php?pid=2084 Time Limit: 1000/1000 MS (Java/Others)    Memory L

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

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

dp 塔 經典動態規劃問題

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

演算法提高 的劃分 動態規劃 無序

問題描述   一個正整數可以劃分為多個正整數的和,比如n=3時:   3;1+2;1+1+1;   共有三種劃分方法。   給出一個正整數,問有多少種劃分方法。 輸入格式   一個正整數n

動態規劃

最長公共子序列問題 Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裡^_^ 題目描述  給定兩個序列X= 輸入 輸入資料有多

【Java】【滾動組】【動態規劃】UVA - 11137 - Ingenuous Cubrency

得到 lose math scanner light clas details 狀態 ann 滾動數組優化自己畫一下就明白了。 http://blog.csdn.net/u014800748/article/details/45849217 解題思路:本題利用遞推關系解決。

動態規劃——塔問題

using 路徑 d3d scan spa 最後一層查找 pen 輸出 ide 從數塔頂層出發,每個結點可以選擇向左走或向右走,要求一直走到塔底,使得走過的路徑上的數值和最大。 #include <iostream> #include <cstd

【bzoj1109】[POI2007]堆積木Klo 動態規劃+樹狀

pan ret 選擇 data 成了 std cpp name 樹狀數組 題目描述 Mary在她的生日禮物中有一些積木。那些積木都是相同大小的立方體。每個積木上面都有一個數。Mary用他的所有積木壘了一個高塔。媽媽告訴Mary遊戲的目的是建一個塔,使得最多的積木在正確的位

動態規劃】windy

center log char enter tdi ++ getc windy數 ace BZOJ1026: [SCOI2009]windy數 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7893 Solved: 3

動態三角形動態規劃思想入門)

star ber name 做到 tar triangle 解決 算法 log 個人心得:動態規劃是一種隸屬於決策學的一個算法思想,他能夠很好的解決多階段決策問題,這種思想對於我們的生活還是科研都是必不可少的, 需要好生體會,學會動態方程的轉移,做到具體問題具體分析。 那這

背包動態規劃 fjutoj2347 采藥

之間 code 是個 std inpu mit cstring text printf 采藥 TimeLimit:1000MS MemoryLimit:128MB 64-bit integer IO format:%lld Problem Descript

背包動態規劃 fjutoj2375 金明的預算方案

tab names form get enter 限定 選中 print 只有一個 金明的預算方案 TimeLimit:1000MS MemoryLimit:128MB 64-bit integer IO format:%lld Problem Descri

51nod 1270 組的最大代價 思路:簡單動態規劃

i++ for end names bits image using idt color 這題是看起來很復雜,但是換個思路就簡單了的題目。 首先每個點要麽取b[i],要麽取1,因為取中間值毫無意義,不能增加最大代價S。 用一個二維數組做動態規劃就很簡單了。 d

最大子矩陣,最大連續子組進階,動態規劃初級,poj1050

ostream 子數組 images 使用 運行時間 規劃 out 思考 turn 題目描述:現給出一個N*N矩陣,要求求出擁有最大和的子矩陣的和。 例如: 這樣的一個矩陣,最大子矩陣的和為15; 此題可以讓人聯想到求最大連續子數組,求最大子數組在上一篇文章中http:/