Description

Input
Output
Sample Input
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
和数字三角形差不多的dp,转移方程
if(i<n)dp[i+1][j]=max(dp[i+1][j],dp[i][j]+A[i+1][j]); if(j<m)dp[i][j+1]=max(dp[i][j+1],dp[i][j]+A[i][j+1]); int k=2; while(k*j<=m) { dp[i][k*j]=max(dp[i][k*j],dp[i][j]+A[i][k*j]); k++; }
#include <stdio.h>
#include<algorithm>
#include<cstring>
#define INF 1<<30
int dp[25][1010],A[21][1001];
using std::max;
int main()
{
//freopen("input.txt","r",stdin);
int n,t,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
for(int j=1;j<=n;j++)
for(int i=1;i<=m;i++)
{
scanf("%d",&A[j][i]);
dp[j][i]=-INF;
}
dp[1][1]=A[1][1];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(i<n)dp[i+1][j]=max(dp[i+1][j],dp[i][j]+A[i+1][j]);
if(j<m)dp[i][j+1]=max(dp[i][j+1],dp[i][j]+A[i][j+1]);
int k=2;
while(k*j<=m)
{
dp[i][k*j]=max(dp[i][k*j],dp[i][j]+A[i][k*j]);
k++;
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}
原文:http://blog.csdn.net/acvcla/article/details/24192229