一、算法分析
乍一看本题有些没有头绪,本题的特点是终点为第一行的任意数,而起点在最后一行,和常见的题相较是反的,而且起点也不在该行的第一个,而是在中间。。。开始的想法是从起点开始找,但是发现很麻烦,但是在仔细一看,画个图出来,这就是不是倒过来的数塔问题吗???所以解法就很直观了,按照和数塔问题一样的思路,从后往前(也就是从第一行开始)倒着推就行了,答案就在起点上。顺便加了一个滚动数组优化,压成一维的。
二、代码及注释
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=255;
int n,m; //还是习惯用n,m
int f[2][maxn];
int pos_ed;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){ //相当于数塔问题的一个改版,采用倒推法
int pos=i&1;
int pre=(i&1)^1;
for(int j=1;j<=m;j++){
scanf("%d",&f[pos][j]); //读入当前数据
f[pos][j]+=max(f[pre][j-1],max(f[pre][j],f[pre][j+1]));//从三个方向继承
}
}
printf("%d",max(f[n&1][m/2+1-1],max(f[n&1][m/2+1],f[n&1][m/2+1+1])));//注意这里,牛的起点可能有三个,因为牛最开始处于最后一行中间点的下方,而不是点上
return 0;
}