官方题解的做法是错的,Hack 数据如下。
1 2
-45 -1
1 2
1 1
output
-45
anwser
0
错误多处。
给出应该正确代码:
#include<map>
#include<set>
#include<ctime>
// #include<cmath>
#include<queue>
#include<bitset>
#include<cstdio>
#include<vector>
#include<random>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
#define I inline ll
#define her1 20090115
#define IV inline void
#define cht 998244353
#define ld long double
#define Aestas16 392699
#define ull unsigned long long
#define mem(x,val)memset(x,val,sizeof x)
#define D(i,j,n)for(register int i=j;i>=n;i--)
#define E(i,now)for(register int i=first[now];i;i=G[i].nxt)
#define F(i,j,n)for(register int i=j;i<=n;i++)
#define DL(i,j,n)for(register ll i=j;i>=n;i--)
#define EL(i,now)for(register ll i=first[now];i;i=G[i].nxt)
#define FL(i,j,n)for(register ll i=j;i<=n;i++)
//#define D(i,j,n)for(int i=j;i>=n;i--)
//#define E(i,now)for(int i=first[now];i;i=G[i].nxt)
//#define F(i,j,n)for(int i=j;i<=n;i++)
//#define DL(i,j,n)for(ll i=j;i>=n;i--)
//#define EL(i,now)for(ll i=first[now];i;i=G[i].nxt)
//#define FL(i,j,n)for(ll i=j;i<=n;i++)
ll read(){
ll ans=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')ans=ans*10+c-'0',c=getchar();
return ans*f;
}
mt19937 rnd(her1);
const int maxn = 3e2+5;
#define x1 sdfkjah
#define y1 dsafpisjh
ll dp[maxn*2][maxn][maxn],x1,y1,xk,yk;
ll n,m,w[maxn][maxn],suf[maxn][maxn];
IV cmax(ll&x,ll val){x<val?x=val,0:0;}
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
n=read();m=read();
F(i,1,n)F(j,1,m)w[i][j]=read();
x1=read();y1=read();xk=read();yk=read();
F(i,0,n+1)F(j,0,m+1)suf[i][j]=-1e18;
D(i,xk,1)D(j,yk,1){
ll mx=-1e18;
if(j+1<=yk)cmax(mx,suf[i][j+1]);
if(i+1<=xk)cmax(mx,suf[i+1][j]);
if(mx==-1e18)mx=0;suf[i][j]=mx+w[i][j];
}
ll ans=-1e18;
// F(i,0,n+1){
// F(j,0,m+1)cout<<suf[i][j]<<' ';
// puts("");
// }
F(i,0,x1+y1)F(j,0,n)F(k,0,x1)dp[i][j][k]=-1e18;
F(k,2,x1+y1)F(Px,1,n)F(Qx,1,x1)if(k-Px<=m&&k-Qx<=y1){
ll Py=k-Px,Qy=k-Qx,mx=-1e18;if(Py<1||Qy<1)continue;
F(p,0,1)F(q,0,1)cmax(mx,dp[k-1][Px-p][Qx-q]);
if(mx==-1e18)mx=0;
if(Px==Qx)dp[k][Px][Qx]=mx+max(0ll,w[Px][Py]);
else dp[k][Px][Qx]=mx+w[Px][Py]+max(0ll,w[Qx][Qy]);
}
F(k,2,x1+y1)F(Px,1,n)F(Qx,1,x1)if(Px==Qx)
dp[k][Px][Qx]=-1e18;
// cout<<dp[5][3][4]<<endl;
F(k,2,x1+y1)F(Px,1,n)F(Qx,1,x1)if(k-Px<=m&&k-Qx<=y1){
ll Py=k-Px,Qy=k-Qx,mx=-1e18;if(Py<1||Qy<1)continue;
F(p,0,1)F(q,0,1)cmax(mx,dp[k-1][Px-p][Qx-q]);
if(mx==-1e18)mx=0;
if(Px==Qx)cmax(dp[k][Px][Qx],mx+w[Px][Py]);
else cmax(dp[k][Px][Qx],mx+w[Px][Py]+max(0ll,w[Qx][Qy]));
}
F(k,2,x1+y1)F(Px,1,n)F(Qx,1,x1)if(k-Px>0&&k-Qx>0&&k-Px<=m&&k-Qx<=y1&&Px==Qx)
cmax(ans,dp[k][Px][Qx]+suf[Px][k-Px]-w[Px][k-Px]);
F(i,0,x1+y1)F(j,0,n)F(k,0,x1)dp[i][j][k]=-1e18;
F(k,2,x1+y1)F(Px,1,n)F(Qx,1,x1)if(k-Px<=m&&k-Qx<=y1){
ll Py=k-Px,Qy=k-Qx,mx=-1e18;if(Py<1||Qy<1)continue;
F(p,0,1)F(q,0,1)cmax(mx,dp[k-1][Px-p][Qx-q]);
if(mx==-1e18)mx=0;
if(Px==Qx)dp[k][Px][Qx]=mx+max(0ll,w[Px][Py]);
else dp[k][Px][Qx]=mx+w[Px][Py]+max(0ll,w[Qx][Qy]);
}
F(k,2,x1+y1)F(Px,1,n)F(Qx,1,x1)if(Px!=Qx)
dp[k][Px][Qx]=-1e18;
F(k,2,x1+y1)F(Px,1,n)F(Qx,1,x1)if(k-Px<=m&&k-Qx<=y1){
ll Py=k-Px,Qy=k-Qx,mx=-1e18;if(Py<1||Qy<1)continue;
F(p,0,1)F(q,0,1)cmax(mx,dp[k-1][Px-p][Qx-q]);
if(mx==-1e18)mx=0;
if(Px==Qx)cmax(dp[k][Px][Qx],mx+max(0ll,w[Px][Py]));
else cmax(dp[k][Px][Qx],mx+w[Px][Py]);
}
F(k,2,x1+y1)F(Px,1,n)F(Qx,1,x1){
if(k-Px>0&&k-Qx>0&&k-Px<=m&&k-Qx<=y1&&(Px!=Qx||(k!=x1+y1&&k==xk+yk&&Px==xk)))
cmax(ans,dp[k][Px][Qx]+suf[Px][k-Px]-w[Px][k-Px]);
}
return cout<<ans,0;
}