这题推荐先看下vfk写的这个定理的证明(然而其实我自己YY出来了,但是不会证)
然后我其实没看懂,但是不影响做题
可以先想象一下把整个图反转过来
我的想法是当一个点在当前点的右上,那么这个点一定不能走到当前,那么就要多花a[i][j]
然后再继承一下上方和右方
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int a[1100][1100],f[1100][1100]; int main() { int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) for(int j=m;j>=1;j--) f[i][j]=max(f[i-1][j+1]+a[i][j],max(f[i-1][j],f[i][j+1])); printf("%d\n",f[n][1]); } return 0; }