1. 程式人生 > >POJ1163數字三角形【簡單動態規劃】

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 program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right. 

Input

Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.

Output

Your program is to write to standard output. The highest sum is written as an integer.

Sample Input

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

Sample Output

30

題意:

一個高度為N的由正整陣列成的三角形,從上走到下,求經過的數字和的最大值。

每次只能走到下一層相鄰的數上,例如從第3層的6向下走,只能走到第4層的2或9上。

   5

  8 4

 3 6 9

7 2 9 5

例子中的最優方案是:5 + 8 + 6 + 9 = 28

分析:

這樣就是向下走和向右下走!

f[i,j]表示從頂層到達第i層第j個位置的最大的得分 ,第i層第j個位置可以由第i-1層的第j個位置或者第i-1層的第 j-1個位置走過來

狀態轉移方程:f[i,j]=max(f[i-1,j],f[i-1,j-1])+a[i,j];

 

對最後一行的f值進行掃描,最大的那一個即是結果

import java.util.*;
import java.math.*;
 
public class Main{
	static int MAXN=(int)(500+10);
	static int[][] a=new int[MAXN][MAXN];
	static int n;
	static long[][] dp=new long[MAXN][MAXN];
	static void init() {
		for(int i=0;i<MAXN;i++)
			for(int j=0;j<MAXN;j++)
			dp[i][j]=0;
	}
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		while(cin.hasNext()) {
			n=cin.nextInt();
			if(n==0)	break;
			for(int i=1;i<=n;i++) {
				for(int j=1;j<=i;j++)
					a[i][j]=cin.nextInt();
			}
			init();
			for(int i=1;i<=n;i++) {
				for(int j=1;j<=i;j++) {
					dp[i][j]=Math.max(dp[i-1][j-1], dp[i-1][j])+a[i][j];
				}
			}
			long ans=-1;
			for(int i=1;i<=n;i++)
				ans=Math.max(ans, dp[n][i]);
			System.out.println(ans);
		}
		cin.close();
	}
}