dp或者记忆化搜索都可以过吧。
但是我的记忆化搜索莫名其妙的WA了。
dp轻松AC.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdlib>
#define LL long long
using namespace std;
int f[209][209],a[209][209];
int n,m,ans;
int main()
{
memset(f,128,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=m;i++) f[1][i]=a[1][i];
for(int i=2;i<=n+1;i++)
{
for(int j=1;j<=m;j++)
{
int p=max(f[i-1][j-1],max(f[i-1][j+1],f[i-1][j]));
f[i][j]=max(f[i][j],p+a[i][j]);
}
}
printf("%d",f[n+1][m/2+1]);
return 0;
}
待查错的记忆化搜索
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdlib>
#define LL long long
using namespace std;
int f[209][209],a[209][209];
int n,m,ans,minn;
int dfs(int x,int y)
{
if(x==0) return 0;
int tot=-1e9;
tot=max(tot,f[x-1][y]!=minn?f[x-1][y]:f[x-1][y]=(dfs(x-1,y)+a[x][y]));
if(y-1>=1) tot=max(tot,f[x-1][y-1]!=minn?f[x-1][y-1]:f[x-1][y-1]=(dfs(x-1,y-1)+a[x][y]));
if(y+1<=m) tot=max(tot,f[x-1][y+1]!=minn?f[x-1][y+1]:f[x-1][y+1]=(dfs(x-1,y+1)+a[x][y]));
return f[x][y]=tot;
}
int main()
{
memset(f,128,sizeof(f));
minn=f[0][0];
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
ans=dfs(n+1,m/2+1);
printf("%d",ans);
return 0;
}