题目:

1 3 8 9 10 10 10 10 -10 10 10 10 -11 -1 0 2 11 10 -20 -11 -11 10 11 2 10 -10 -10
52
主要是考虑在第1行第1 列的情况,所以要仔细判断。。。
这部分注意代码为:
if(i==1&&j==1) continue;
if(i==1&&j!=1) dp[i][j]=dp[i][j-1];
if(j==1&&i!=1) dp[i][j]=dp[i-1][j];
if(i!=1&&j!=1)
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int map[25][1005],dp[25][1005];
int main()
{
int t,n,m,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&map[i][j]);
memset(dp,0,sizeof(dp));
dp[1][1]=map[1][1];
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(i==1&&j==1) continue;
if(i==1&&j!=1) dp[i][j]=dp[i][j-1];
if(j==1&&i!=1) dp[i][j]=dp[i-1][j];
if(i!=1&&j!=1)
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
for(k=2;k<=m;k++)
{
if((double)j/k==j/k)
dp[i][j]=max(dp[i][j],dp[i][j/k]);
}
dp[i][j]+=map[i][j];
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}
原文:http://blog.csdn.net/u014303647/article/details/26293571