1157 那23个路口
2021-07-16
dp思路
memsethttps://blog.csdn.net/sandalphon4869/article/details/105404397
参考答案http://blog.huati365.com/9c8572803228d41a
如果在网站上出现编译错误,而在自己的编译器上没有,那可能是因为网站提交不支持动态定义数组。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[302][302][23]={}; //把它放在main函数里面可能会报错
int main(){
int n,m;
cin>>n>>m;
memset(dp,-0x3f3f3f3f,sizeof(dp));
ll a[302][302]={};
memset(a,-1,sizeof(a));
for (int i=1;i<=m;i++){
for (int j=1;j<=n;j++){
cin>>a[i][j];
if (a[i][j]==0){
dp[i][j][0]=0;
}
}
}
for (int k=1;k<=22;k++){
for (int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
ll tmp=max(dp[i][j][k],dp[i-1][j][k-1]+a[i][j]);
tmp=max(tmp,dp[i+1][j][k-1]+a[i][j]);
tmp=max(tmp,dp[i][j-1][k-1]+a[i][j]);
dp[i][j][k]=max(tmp,dp[i][j+1][k-1]+a[i][j]);
}
}
}
int k=23;
ll max_value=-0x3f3f3f3f;
for (int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
ll tmp=max(dp[i][j][k],dp[i-1][j][k-1]+a[i][j]);
tmp=max(tmp,dp[i+1][j][k-1]+a[i][j]);
tmp=max(tmp,dp[i][j-1][k-1]+a[i][j]);
dp[i][j][k]=max(tmp,dp[i][j+1][k-1]+a[i][j]);
if (max_value<dp[i][j][k-1]){
max_value=dp[i][j][k];
}
}
}
cout<<max_value<<endl;
return 0;
}