动态规划
状态转移方程 dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i][k])+v[i][j] 1<=k<j&&j%k==0
#include<bits/stdc++.h>
using namespace std;
int k[120][1020],dp[120][1020];
int main()
{
int C,n,m;
scanf("%d",&C);
for(int kase=1;kase<=C;kase++)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&k[i][j]);
dp[1][1]=k[1][1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i==1&&j==1)
continue;
int maxn=INT_MIN;
for(int l=1;l<j;l++)
{
if(j%l==0&&dp[i][l]>maxn)
maxn=dp[i][l];
}
if(i-1>=1&&dp[i-1][j]>maxn)
maxn=dp[i-1][j];
if(j-1>=1&&dp[i][j-1]>maxn)
maxn=dp[i][j-1];
dp[i][j]=maxn+k[i][j];
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}