#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 110;
int f[N][N][N];
int a[N][N];
int n;
int main(){
cin >> n;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= i;j++){
cin >> a[i][j];
}
}
for(int i = 1;i <= n;i++)f[n][i][0] = a[n][i];
//f[i][j][k]----->表示到i,j,向左下走k次。
for(int i = n-1;i >= 1;i--){
for(int j = 1;j <= i;j++){
for(int k = 0;k <= n-i;k++){
f[i][j][k] = f[i+1][j+1][k]+a[i][j];//从右下来的,则左下走k次,k与下一层是一样的
if(k >= 1){//当下一层的往左下的次数是大于1,此时才可能是从左下来的,因为要减去1
f[i][j][k] = max(f[i][j][k],f[i+1][j][k-1] + a[i][j]);
}
}
}
}
if(n % 2 == 1){//n是奇数,则移动次数n-1位偶数,则一定是对半分的次数
cout << f[1][1][(n-1)/2];
}
else{//n是偶数,移动次数n-1是奇数,则可能是1-0,也可能0-1组合
cout << max(f[1][1][(n-1)/2],f[1][1][(n-1)/2+1]);
}
return 0;
}`
2 回复
0 转发
0 喜欢
6 阅读



