HDOJ 2084 數塔 【dp】
狀態是從當前位置出發的最大和
轉移方程是當前的數值 加上下面兩個方向的位置開始的最大和
即dp[i][j] = a[i][j] + max(dp[i+1][j], dp[i+1][j+1]);
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define clr(c) memset(c, 0, sizeof(c));
const int MAXL = 105;
int C, N;
int a[MAXL][MAXL];
int dp[MAXL][MAXL];
void Resolve(){
clr(dp);
for(int j = 1; j <= N; j++) dp[N][j] = a[N][j];
for(int i = N-1; i >= 1; i--){
for(int j = 1; j <= i; j++){
dp[i][j] = a[i][j] + max(dp[i+1][j], dp[i+1][j+1]);
}
}
// for(int i = 1; i <= N; i++){
// for(int j = 1; j <= i; j++){
// printf("%d ", dp[i][j]);
// }
// printf("\n");
// }
}
int main(){
clr(a);
scanf("%d", &C);
while(C--){
scanf("%d", &N);
for(int i = 1; i <= N; i++){
for(int j = 1; j <= i; j++){
scanf("%d", &a[i][j]);
}
}
Resolve();
printf("%d\n", dp[1][1]);
}
return 0;
}