1. 程式人生 > 實用技巧 >P1216數字三角形 Number Triangles

P1216數字三角形 Number Triangles

菜題 P1216數字三角形 Number Triangles

簡介

很簡單的一道dp練手題,,,
他不是簡不簡單的問題,

他真的是那種,很少見的那種

題目(from 洛谷)

題目描述
觀察下面的數字金字塔。

寫一個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

上思路

** 顯 然 **
狀態轉移:

f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]

f即為到達i j格用最短長度 a即為每格子中數值
注意遞推的順序

上程式碼

#include <bits/stdc++.h>
#define N 1010
using namespace std;
int a[N][N],f[N][N],x;
int main(){
	cin>>x;
	for(int i=1;i<=x;i++)
		for(int j=1;j<=i;j++)
			cin>>a[i][j];
	for(int i=x;i>=1;i--){
		for(int j=i;j>=1;j--){
			f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j];
		}
	}
	cout<<f[1][1]<<endl;
	return 0;
}