#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10;
int n;
int d[maxn][maxn],a[maxn][maxn];
int ans;
int dp1(int i, int j) {
if(d[i][j] >= 0)
return d[i][j];
else
return d[i][j] = a[i][j] + ( i == n - 1 ? 0 :max( dp1(i+1,j), dp1(i+1,j+1) ) );
}
int dp2() {
for(int i = 0; i < n; i++)
d[n-1][i] = a[n-1][i];
for(int i = n - 2; i >= 0; i--)
for(int j = 0; j <= i; j++)
d[i][j] = a[i][j] + max(d[i+1][j],d[i+1][j+1]);
}
int main() {
while(scanf("%d",&n) != EOF && n) {
for(int i = 0; i < n; i++)
for(int j = 0; j <= i; j++)
scanf("%d",&a[i][j]);
dp2();
printf("%d\n",d[0][0]);
memset(d,-1,sizeof(d));
ans = dp1(0,0);
printf("%d\n",ans);
printf("%d\n",d[0][0]);
}
return 0;
}
动态规划的记忆搜索与递推
最新推荐文章于 2023-05-11 08:57:25 发布