标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571
题面:

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
递推水题,按照给定规则递推即可,没有什么特别的难度,只需注意将初值设为-2000010即可。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,val[21][1005],dp[21][1005];
int max(int a,int b)
{
return a<b?b:a;
}
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dp[i][j]=-2000010;
dp[1][1]=val[1][1];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&val[i][j]);
init();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j+1]=max(dp[i][j+1],dp[i][j]+val[i][j+1]);
dp[i+1][j]=max(dp[i+1][j],dp[i][j]+val[i+1][j]);
for(int k=2*j;k<=m;k+=j)
{
dp[i][k]=max(dp[i][k],dp[i][j]+val[i][k]);
}
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}标签:
原文地址:http://blog.csdn.net/david_jett/article/details/51367253