在学习动态规划,很多地方都没有优化
#include <stdio.h>
#include <string.h>
#include <math.h>
int arr[20][1000],yz[1001];
int dp[20][1000];
int yinzi(int n)
{
int i,p=0;
for(i=1;i<sqrt(n)+1;i++)
{
if(n%i==0)
{
yz[p++]=i;
yz[p++]=n/i;
}
}
if(yz[p-1]==yz[p-2])p--;
if(n==2)p=0;
if(n==1)p=0;
return p;
}
int main(void)
{
int c,i,j,k,r;
scanf("%d",&c);
for(k=0;k<c;k++)
{
int n,m;
scanf("%d%d",&n,&m);
for(i=0;i<20;i++)for(j=0;j<1000;j++)dp[i][j]=-100000000;
for(i=0;i<n;i++)for(j=0;j<m;j++){
scanf("%d",&arr[i][j]);
}
/*for(i=0;i<m;i++)dp[0][i]=arr[0][i];
for(i=0;i<n;i++)dp[i][0]=arr[i][0];*/
dp[0][0]=arr[0][0];
for(i=0;i<n;i++)for(j=0;j<m;j++){
int yzlen=yinzi(j+1);
int max=0;
for(r=0;r<yzlen;r++)
{
if(dp[i][j]<dp[i][(j+1)/yz[r]-1]+arr[i][j])
dp[i][j]=dp[i][(j+1)/yz[r]-1]+arr[i][j];
}
if(j>0&&dp[i][j]<dp[i][j-1]+arr[i][j])
dp[i][j]=dp[i][j-1]+arr[i][j];
if(i>0&&dp[i][j]<dp[i-1][j]+arr[i][j])
dp[i][j]=dp[i-1][j]+arr[i][j];
}
/*for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%d ",dp[i][j]);
}
puts("");
}
puts("");*/
printf("%d\n",dp[n-1][m-1]);
}
return 0;
}