1. 程式人生 > >藍橋杯 奪寶奇兵

藍橋杯 奪寶奇兵

題目

題目描述:

 在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖:

73 88 1 02 7 4 44 5 2 6 5從山下出發,到達山頂,如何選路才能得到最多的珠寶呢?在上圖所示例子中,按照5->7->8->3->7的順序,將得到最大值30

輸入:

第一行正整數N(100>=N>1),表示山的高度。接下來有N行非負整數,第i行有i個整數(1<=i<=N),表示山的第i層上從左到右每條路上的珠寶數目

輸出:

一個整數,表示從山底到山頂的所能得到的珠寶的最大數目.

樣例輸入
5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5
樣例輸出
30

思路

這題應該是一個簡單的dp了

有遞推關係式f[i][j]=Max(f[i+1][j],f[i+1][j+1])+f[i][j],從下往上遞推。

最後f[0][0]就是所求解。

程式碼

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    	Scanner scan=new Scanner(System.in);
    	int a[][] = new int[110][110];
    	for(int i=0;i<110;i++) {
    		for(int j=0;j<110;j++) {
    			a[i][j] = 0;
    		}
    	}
    	int out[][] = new int [110][110];
    	int n=scan.nextInt();
    	for(int i=0;i<n;i++) {
    		for(int j=0;j<=i;j++) {
    			a[i][j] = scan.nextInt();
    			
    		}
    		
    	}
    	for(int i=n-1;i>=0;i--) {
    		for(int j=0;j<=i;j++) {
    			out[i][j]=(a[i+1][j]>a[i+1][j+1]?a[i+1][j]:a[i+1][j+1])+a[i][j];
    			a[i][j]=out[i][j];
    		}
    	}
    	System.out.println(out[0][0]);
    
    
    }

}