if(x==1) f(x,y)=max{f(x,y-1),f(x,z)} {y%z==0&&1<y/z<=y&&1<=z<<y}
else f(x,y)=max{f(x-1),f(x,y-1),f(x,z)} {y%z==0&&1<y/z<=y&&1<=z<=y}
#include <stdio.h> #include <math.h> int mmax(int a,int b){ int t; if(a>b) t=a; else t=b; return t; } int main(){ int t,n,m,i,j,res,max,z; int tmp; int f[25][1100]; int gird[25][1100]; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(i=1;i<=n;++i) for(j=1;j<=m;++j){ scanf("%d",&gird[i][j]); f[i][j]=-1000000; } for(i=1;i<=m;++i){ if(i==1) {f[1][i]=gird[1][i];continue;} f[1][i]=mmax(f[1][i],f[1][i-1]); for(z=1;z<=i;++z){ if(i%z==0&&i/z>1&&i/z<=i){ f[1][i]=mmax(f[1][i],f[1][z]); } } f[1][i]+=gird[1][i]; } for(i=2;i<=n;++i){ for(j=1;j<=m;++j){ if(j==1) {f[i][j]=gird[i][j]+f[i-1][j];continue;} f[i][j]=mmax(f[i-1][j],f[i][j-1]); for(z=1;z<=j;++z){ if(j%z==0&&j/z>1&&j/z<=j){ f[i][j]=mmax(f[i][j],f[i][z]); } } f[i][j]=f[i][j]+gird[i][j]; } } printf("%d ",f[n][m]); } return 0; }