数字三角形
这道题和这道题有点像
这是一道经典DP题
这个也是一样:
对于ax,y,只能从ax−1,y和ax−1,y−1转移而来。
所以状态转移方程就是:fx,y=max(fx−1,y,fx−1,y−1)+ax,y。
还要注意有个坑点:就是数值有可能是负数。
代码:(还是边读入边处理)
#include <bits/stdc++.h>
using namespace std;
int n, a[510][510];
int main() {
scanf("%d", &n);
for (int i = 1;i <= n; i++)
for (int j = 0;j <= n + 1; j++) a[i][j] = -10000000; //两边也要设为负数。
for (int i = 1;i <= n; i++)
for (int j = 1;j <= i; j++) {
scanf("%d", &a[i][j]);
a[i][j] += max(a[i - 1][j], a[i - 1][j - 1]);
}
int ans = -10000000;
for (int i = 1;i <= n; i++) ans = max(ans, a[n][i]); //统计ans
printf("%d\n", ans);
return 0;
}
用得着这样吗?
补充代码:
#include <iostream> using namespace std; const int N = 500; int a[N][N]; int n; int main() { cin >> n; for (int i = 1; i <= n; i ++ ) for (int j = 0; j < i; j ++ ) cin >> a[n - i][j]; for (int i = n - 1; i; i -- ) for (int j = 0; j < i; j ++ ) a[n - i][j] += max(a[n - i - 1][j], a[n - i - 1][j + 1]); cout << a[n - 1][0]; return 0; }
你™告诉我这还算坑????