暴搜 25pts,TLE 记录。
记搜 10pts,WA 记录。
记搜代码:
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 0x8000000000000000
using namespace std;
const int N=1e3+2;
using ll=long long;
ll n,m,mp[N][N],dp[N][N][4];
bitset<N>vst[N];
ll dfs(ll x,ll y) {
if(x==n&&y==m) return mp[n][m];
ll tmp;
if(x-1>0&&!vst[x-1][y]&&dp[x][y][0]==INF) {
vst[x-1][y]=1;
tmp=dfs(x-1,y);
dp[x][y][0]=(tmp==INF?INF:tmp+mp[x][y]);
vst[x-1][y]=0;
}
if(x+1<=n&&!vst[x+1][y]&&dp[x][y][1]==INF) {
vst[x+1][y]=1;
tmp=dfs(x+1,y);
dp[x][y][1]=(tmp==INF?INF:tmp+mp[x][y]);
vst[x+1][y]=0;
}
if(y+1<=m&&!vst[x][y+1]&&dp[x][y][2]==INF) {
vst[x][y+1]=1;
tmp=dfs(x,y+1);
dp[x][y][2]=(tmp==INF?INF:tmp+mp[x][y]);
vst[x][y+1]=0;
}
// sort(dp[x][y],dp[x][y]+3);
ll ans=max(max(dp[x][y][0],dp[x][y][1]),dp[x][y][2]);
return ans;
// return dp[x][y][0]=dp[x][y][1]=dp[x][y][2]=(dp[x][y][2]==INF?INF:dp[x][y][2]+mp[x][y]);
}
int main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(ll i=1;i<=n;++i)
for(ll j=1;j<=m;++j) {
fill(dp[i][j],dp[i][j]+4,INF);
cin>>mp[i][j];
}
vst[1][1]=1;
cout<<dfs(1,1);
return 0;
}
求调