题解:简单动态规划
#include <cstdio> #include <iostream> using namespace std; int f[21][1001]; int max(int a,int b){return(a>b?a:b);} 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",&f[i][j]); for(int i=n-1; i; i--) f[i][m]+=f[i+1][m]; for(int j=m-1; j; j--) f[n][j]+=f[n][j+1]; for(int i=n-1;i;i--) for(int j=m-1;j;j--) { int temp; temp=max(f[i+1][j],f[i][j+1]); for(int k=2; k*j<=m; k++) temp=max(temp,f[i][k*j]); f[i][j]+=temp; } printf("%d\n",f[1][1]); } return 0; }