1002 數塔取數問題 (DP)
阿新 • • 發佈:2018-12-13
基準時間限制:1 秒 空間限制:131072 KB 分值: 5 難度:1級演算法題
一個高度為N的由正整陣列成的三角形,從上走到下,求經過的數字和的最大值。
每次只能走到下一層相鄰的數上,例如從第3層的6向下走,只能走到第4層的2或9上。
5
8 4
3 6 9
7 2 9 5
例子中的最優方案是:5 + 8 + 6 + 9 = 28
Input
第1行:N,N為數塔的高度。(2 <= N <= 500) 第2 - N + 1行:每行包括1層數塔的數字,第2行1個數,第3行2個數......第k+1行k個數。數與數之間用空格分隔(0 <= A[i] <= 10^5) 。
Output
輸出最大值
Input示例
4 5 8 4 3 6 9 7 2 9 5
Output示例
28
#include<bits/stdc++.h> using namespace std; #define clr(a) memset(a,0,sizeof(a)) #define line cout<<"------------"<<endl typedef long long ll; const int maxn = 1e5 + 10; const int MAXN = 1e6 + 10; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; const int N = 1010; int a[N][N], dp[N][N]; int main(){ int n; scanf("%d", &n); for(int i=1; i<=n; i++){ for(int j=1; j<=i; j++){ scanf("%d", &a[i][j]); } } int sum = 0; for(int i=n; i>=1; i--){ for(int j=1; j<=i; j++){ dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + a[i][j]; } } printf("%d\n", dp[1][1]); return 0; }