http://acm.hdu.edu.cn/showproblem.php?pid=2571
一开始就有了思路了
不过中途各种边界问题和初始化问题,而且方程也写错了
方程
dp[i][j]=max(dp[i-1][j]+maps[i][j],dp[i][j-1]+maps[i][j]);
and
while(sign<=j)
{
if(j%sign==0)
dp[i][j]=max(dp[i][j],dp[i][j/sign]+maps[i][j]);
sign++;
}
第一个就不说了
第二个是考虑前面的倍数 跳的情况
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
int dp[25][1005];
int maps[25][1005];
int maxs(int a,int b,int c)
{
int d=a>b?a:b;
return d>c?d:c;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
dp[i][j]=-1000;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&maps[i][j]);
dp[1][1]=maps[1][1];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(i==1&&j==1)
continue;
dp[i][j]=max(dp[i-1][j]+maps[i][j],dp[i][j-1]+maps[i][j]);
int sign=2;
while(sign<=j)
{
if(j%sign==0)
dp[i][j]=max(dp[i][j],dp[i][j/sign]+maps[i][j]);
sign++;
}
}
printf("%d\n",dp[n][m]);
}
}