是最后一个数据点。
复杂度应该没假,同样规模的数据点跑得飞快,唯独这一个点完全超时。
#include<bits/stdc++.h>
using namespace std;
struct Case
{
using ll=long long;
static const int MAXN=210;
ll a[MAXN][MAXN];
int n,m;
unordered_map<ll,ll>mp[MAXN][2];
void ipt()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%lld",&a[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
a[i][j]-=i+j;
}
void chkmin(ll&x,ll y)
{
x=min(x,y);
}
void next(int x,int y,int k)
{
for(auto i=mp[x][k].begin();i!=mp[x][k].end();i++)
{
if(y+1<m)
{
if(mp[x][k^1].count(min(a[x][y+1],i->first)))
chkmin(mp[x][k^1][min(a[x][y+1],i->first)],i->second+a[x][y+1]);
else
mp[x][k^1][min(a[x][y+1],i->first)]=i->second+a[x][y+1];
}
if(x+1<n)
{
if(mp[x+1][k^1].count(min(a[x+1][y],i->first)))
chkmin(mp[x+1][k^1][min(a[x+1][y],i->first)],i->second+a[x+1][y]);
else
mp[x+1][k^1][min(a[x+1][y],i->first)]=i->second+a[x+1][y];
}
}
mp[x][k].clear();
}
void clear(int k)
{
for(int i=0;i<=n;i++)
mp[i][k].clear();
}
void calc()
{
mp[0][0][a[0][0]]=a[0][0];
for(int ij=0;ij<n+m-2;ij++)
for(int i=max(0,ij-m+1);i<=min(ij,n-1);i++)
next(i,ij-i,ij&1);
ll ans=LONG_LONG_MAX;
for(auto i=mp[n-1][(n+m)&1].begin();i!=mp[n-1][(n+m)&1].end();i++)
{
chkmin(ans,i->second-i->first*(n+m-1));
}
clear((n+m)&1);
printf("%lld\n",ans);
}
void solve()
{
ipt();
calc();
}
}T;
int main()
{
int t;
scanf("%d",&t);
while(t--)
T.solve();
}