简单的动态规划
#include<iostream>
#include<cstdio>
using namespace std;
int Max(int a,int b)
{
if(a>b)
return a;
return b;
}
int main()
{
int t,n,m,k,i,j,map[23][1003],dp[23][1003];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&map[i][j]);
for(i=0;i<=n+1;i++)
dp[i][0]=-9999;
for(j=0;j<=m+1;j++)
dp[0][j]=-9999;
dp[1][1]=map[1][1];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(i!=1||j!=1)
{
dp[i][j]=(dp[i-1][j]+map[i][j])>(dp[i][j-1]+map[i][j])?(dp[i-1][j]+map[i][j]):(dp[i][j-1]+map[i][j]);
for(k=1;k<=j/2;k++)
if(j%k==0)
dp[i][j]=Max(dp[i][j],(dp[i][k]+map[i][j]));
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}