【数字三角形】
一. f[i][j] 用一个数代表某个集合
二.f[][] 考虑一下这个数组有几维
1. 这个数组代表的集合是什么? (1) 数组存的是一个数, 存的这个数代表 集合中的什么属性(Max, min, cnt)
2. 这个集合怎么算 (1) f[3, 2] 表示所有从[1, 1] 开始走, 走到 [3, 2] 这个位置的所有走法
1. 集合:所有从(1, 1) 开始走, 走到(i, j) 这个位置的所有走法的集合 数(属性) : Max
2. 集合计算: f[i, j] = max(f[i - 1, j], f[i - 1, j - 1]) + g[i, j]; f[1, 1] = g[1, 1] 3. 初始化 (边界)
4. 时间复杂度 O(n^2)
#include <iostream>
#include <stdlib.h>
using namespace std;
const int N = 510, INF = 1e9;
int n;
int g[N][N], f[N][N];
int main(){
cin >> n;
for (int i = 0; i <= n; i ++ )
for (int j = 0; j <= n; j ++ )
f[i][j] = -INF; //初始化
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= i; j ++ )
cin >> g[i][j];
f[1][1] = g[1][1];
for (int i = 2; i <= n; i ++ )
for (int j = 1; j <= i; j ++ )
f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + g[i][j];
int res = -INF;
for (int i = 1; i <= n; i ++ )
res = max(res, f[n][i]);
cout << res << endl;
return 0;
}
另
#include <iostream>
#include <stdlib.h>
using namespace std;
const int N = 510, INF = 1e9;
int g[N][N];
int n, cnt, ans = -INF;
void dfs(int x, int y) // x, y{
if (x == n) {
if (cnt > ans)
ans = cnt;
return;
}
cnt += g[x + 1][y];
dfs(x + 1, y);
cnt -= g[x + 1][y];
cnt += g[x + 1][y + 1];
dfs(x + 1, y + 1);
cnt -= g[x + 1][y + 1];
}
int main(){
cin >> n;
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= i; j ++ )
cin >> g[i][j];
cnt = g[1][1];
dfs(1, 1);//从(1,1)开始
cout << ans << endl;
return 0;
}