状态方程:sum[i][j]
=
max{sum[i
-
1
][j],sum[i][k]}
+
v[i][j];其中1
<=
k
<=
j
-
1
,且k是j的因子
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int MAX(int a,int b)
{
return a>b?a:b;
}
int dp[25][1005];
int n,m;
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>dp[i][j];
for(int i=1;i<=n;i++)
{for(int j=1;j<=m;j++)
{
int ans=0;
if(i==1&&j==1) continue;
if(i==1&&j>1)
ans=dp[i][j-1];
else if(j==1&&i>1)
ans=dp[i-1][j];
else
ans=MAX(dp[i-1][j],dp[i][j-1]);
for(int p=1;p<j;p++)
if(j%p==0)
ans=MAX(ans,dp[i][p]);
dp[i][j]+=ans;
}
}
cout<<dp[n][m]<<endl;
}
return 0;
}