故事的起源不加赘述,那23个路口。
单刀直入,我直接说题的意思。
蚊子和疯子在作一件事,就是他们要在茫茫的大街上找一个出发点,而后从出发点开始,通过上下左右23次拐弯,到达一个他们也不知道的地方。
老城的街道排列的十分有规律,因而疯子和蚊子把老城的街道排布画在了一张地图上。地图上每个点表明一个地方,而这个地方有必定的憧憬值,疯子但愿能够带蚊子走过的二十三个路口的憧憬值总和是全部方案中最大的。
如今咱们读入一个矩阵,若是此点为0,则这个点为起点,若是此点为-1,则这个点为障碍点,不然这个数表明憧憬值。注意起点和障碍点是没有憧憬值的,起点只有开始的时候能够达到,不能够再回来。而障碍点根本就不能够走过。这样一来,请你选择合适的路线,使走完23个路口后获得最大的憧憬值,有憧憬值的点能够重复进出,每次能够选择四个方向,上下左右。起点为第0个路口html
第1行两个整数 n,m (茫茫大街的长和宽)ios
第2行到第m+1行,每行n个整数$A_{ij}$(第I行第j个地点的憧憬值)code
一个整数sum (能够获得的最大憧憬值)htm
$\texttt{input#1}$
4 4
1 1 1 1
1 1 0 1
1 1 1 1
1 1 1 1blog
$\texttt{output#1}$
23get
于30%的数据,$n,m \leqslant 50$input
0<n,m<300,每一个点的憧憬值能够用longint表示。string
dp。f[i][j][k]表示第k步走到(i,j)这个位置的最大憧憬值.则有,it
if(map[i][j]<=0) continue; if(j>1&&map[i][j-1]>=0) f[i][j][k]=max(f[i][j][k],f[i][j-1][k-1]+map[i][j]); if(j<m&&map[i][j+1]>=0) f[i][j][k]=max(f[i][j][k],f[i][j+1][k-1]+map[i][j]); if(i>1&&map[i-1][j]>=0) f[i][j][k]=max(f[i][j][k],f[i-1][j][k-1]+map[i][j]); if(i<n&&map[i-1][j]>=0) f[i][j][k]=max(f[i][j][k],f[i+1][j][k-1]+map[i][j]);
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm> #define max(a,b) a>b?a:b #define MAXN 301 typedef long long ll; int n,m; ll f[MAXN][MAXN][24],map[MAXN][MAXN],ans; inline void read(ll &T) { ll x=0;bool f=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} T=f?-x:x; } int main() { scanf("%d%d",&m,&n); memset(f,-0x3f3f3f,sizeof(f)); for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { read(map[i][j]); if(map[i][j]==0) f[i][j][0]=0; } } for(int k=1;k<=23;++k) { for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(map[i][j]<=0) continue; if(j>1&&map[i][j-1]>=0) f[i][j][k]=max(f[i][j][k],f[i][j-1][k-1]+map[i][j]); if(j<m&&map[i][j+1]>=0) f[i][j][k]=max(f[i][j][k],f[i][j+1][k-1]+map[i][j]); if(i>1&&map[i-1][j]>=0) f[i][j][k]=max(f[i][j][k],f[i-1][j][k-1]+map[i][j]); if(i<n&&map[i-1][j]>=0) f[i][j][k]=max(f[i][j][k],f[i+1][j][k-1]+map[i][j]); } } } for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { if(ans<f[i][j][23]) ans=f[i][j][23]; } } std::cout<<ans<<'\n'; return 0; }