题目:http://acm.hdu.edu.cn/showproblem.php?pid=2571
没什么好说的,不过要处理好边界。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#include <algorithm>
#include <math.h>
typedef __int64 ll;
using namespace std;
int w[][],dp[][];
int n,m;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
scanf("%d",&w[i][j]);
}
}
memset(dp,,sizeof(dp));
dp[][]=w[][];
for(int i=;i<=m;i++)
{
dp[][i]=dp[][i-]+w[][i];
for(int j=;j<i;j++)
{
if(i%j==) dp[][i]=max(dp[][i],dp[][j]+w[][i]);
}
}
for(int i=;i<=n;i++)
{
dp[i][]=dp[i-][]+w[i][];
}
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
dp[i][j]=dp[i-][j]+w[i][j];
dp[i][j]=max(dp[i][j],dp[i][j-]+w[i][j]);
for(int k=; k<j; k++)
{
if(j%k==) dp[i][j]=max(dp[i][j],dp[i][k]+w[i][j]);
}
}
}
printf("%d\n",dp[n][m]);
}
return ;
}