算法竞赛入门经典(第二版) 第九章
递归
#include<string.h> #include<stdio.h> #include<stdlib.h> #define MAXN 100+5 int n; int a[MAXN][MAXN]; int solve(int i, int j) { if (i != n) return a[i][j] + max(solve(i + 1, j), solve(i + 1, j + 1)); else return a[i][j]; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { scanf("%d",&a[i][j]); } } printf("%d", solve(1, 1)); }
递推
#include<string.h> #include<stdio.h> #include<stdlib.h> #define MAXN 100+5 int n; int a[MAXN][MAXN]; int d[MAXN][MAXN]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { scanf("%d",&a[i][j]); } } for (int i = 1; i <= n; i++) d[n][i] = a[n][i]; for (int i = n; 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", d[1][1]); }
记忆
#include<string.h> #include<stdio.h> #include<stdlib.h> #define MAXN 100+5 int n; int a[MAXN][MAXN]; int d[MAXN][MAXN]; int solve(int i, int j) { if (d[i][j] > 0) return d[i][j]; if (i != n) return a[i][j] + max(solve(i + 1, j), solve(i + 1, j + 1)); else return a[i][j]; } int main() { memset(d, -1, sizeof(-1)); scanf("%d", &n); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { scanf("%d",&a[i][j]); } } printf("%d", solve(1,1)); }