倍数的移动就相当于判断
j%k是不是等于0
View Code
#include <stdio.h>
int c ;
int n , m;
int dp[25][1010];
int main()
{
int i , j , k;
int ntemp;
scanf("%d",&c);
while(c--)
{
scanf("%d%d",&n,&m);
for(i = 0 ; i <= n ; i++)
for(j = 0 ; j <= m ; j++)
dp[i][j] = -999999;
dp[1][0] = dp[0][1] = 0;
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++)
{
ntemp = dp[i-1][j];
ntemp = ntemp > dp[i][j-1]? ntemp : dp[i][j-1];//选择向下 还是选择向右
for( k = 1 ; k < j ; k++ )
{
if(j % k == 0)
ntemp = ntemp > dp[i][k]?ntemp:dp[i][k];
}
dp[i][j] += ntemp;
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}