题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571
//状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i][j%k])
#include <stdio.h>
#include <string.h>
int dp[21][1002];
int main()
{
int n,m,i,j,k,temp,test;
scanf("%d",&test);
while(test--)
{
scanf("%d %d",&n,&m);
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
scanf("%d",&dp[i][j]);
}
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
if(i==1&&j==1)
continue;
if(i==1)
temp=dp[i][j-1];
else if(j==1)
temp=dp[i-1][j];
else
temp=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
for(k=1;k<j;++k)
if(j%k==0)
temp=temp>dp[i][k]?temp:dp[i][k];
dp[i][j]+=temp;
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}