好厉害。
注意到到了(i,j)就一定到不了(i-1,j+1),那么可以dp啦。dp[i][j]表示(i,j)右上角都清了的方案数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1050
using namespace std;
long long t,n,m,a[maxn][maxn],dp[maxn][maxn];
int main()
{
scanf("%lld",&t);
for (long long i=;i<=t;i++)
{
scanf("%lld%lld",&n,&m);
for (long long i=;i<=n;i++)
for (long long j=;j<=m;j++)
{
scanf("%lld",&a[i][j]);
dp[i][j]=;
}
for (long long i=;i<=n;i++)
for (long long j=m;j>=;j--)
dp[i][j]=max(dp[i-][j+]+a[i][j],max(dp[i-][j],dp[i][j+]));
printf("%lld\n",dp[n][]);
}
return ;
}