题目地址
关于数字三角形,很容易找到其中的状态方程。参考《竞赛入门》中第九章动态规划第一节。
状态方程为的d[i][j] = max(d[i+1][j], d[i + 1][j + 1];用一个二维数组来存储数字三角形,就可以了。
贴上源代码,这道题只是初始看了动态规划
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
//#define LOCAL
int d[101][101];
int a[101][101];
int n;
int dp(int x, int y) {
if(d[x][y] >= 0) {
return d[x][y];
}
return d[x][y] = a[x][y] + (x == n? 0: max(dp(x + 1, y), dp(x + 1, y + 1)));
}
int main() {
#ifdef LOCAL
FILE *fi;
fi = fopen("hdu2084.txt", "r");
#endif
/*
int c;
scanf("%d", &c);
while(c--) {
int a[101][101];
memset(a, 0, sizeof(a));
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= i; j++) {
scanf("%d", &a[i][j]);
}
}
for(int j = 1; j <= n; j++) {
d[n][j] = a[n][j];
}
for(int i = n - 1; i >= 1; i--) {
for(int j = 1; j <= i; j++) {
d[i][j] = a[i][j] + max(d[i + 1][j], d[i + 1][j + 1]);
}
}
printf("%d\n", d[1][1]);
}
*/
int c;
scanf("%d", &c);
while(c--) {
memset(d, -1, sizeof(d));
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= i; j++) {
scanf("%d", &a[i][j]);
}
}
for(int j = 1; j <= n; j++) {
d[n][j] = a[n][j];
}
dp(1, 1);
printf("%d\n", d[1][1]);
}
return 0;
}