我开始按照自己的思路做完题,提交WA,后来发现了是因为没有考虑第一行的特殊情况,但是不想重新写代码了,就在原来的基础上各种打补丁,结果反倒浪费了很多时间。
就是一个数塔,不过运动的方式多了一点儿。
#include<stdio.h>
#include<string.h>
int Max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int i,j,k,m,n;
int map[25][1005];
int t;
int temp;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
map[i][j]=0;
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
}
for(j=1;j<=n;j++)
{
if(j==1)
continue;
temp=map[1][j];
if(j==2)
{
map[1][2]=map[1][1]+map[1][2];
continue;
}
k=2;
map[1][j]=map[1][1]+map[1][j];
while(j>=k)
{
if(j%k==0)
map[1][j]=Max(map[1][j],map[1][j/k]+temp);
k++;
}
map[1][j]=Max(map[1][j],map[1][j-1]+temp);
}
for(i=2;i<=m;i++)
{
map[i][1]=map[i-1][1]+map[i][1];
for(j=2;j<=n;j++)
{
k=2;
temp=map[i][j];
map[i][j]=map[i][j-1]+temp;
while(j>=k)
{
if(j%k==0)
map[i][j]=Max(map[i][j],temp+map[i][j/k]);
k++;
}
map[i][j]=Max(map[i][j],map[i-1][j]+temp);
}
}
printf("%d\n",map[m][n]);
}
return 0;
}