HDOJ2571命运
链接 http://acm.hdu.edu.cn/showproblem.php?pid=2571
状态转移方程:dp[i][j]+=max(max(dp[i][j+1],dp[i+1][j]),dp[i][j*k](PS:k>2))
注意方程中下标都要合法,满足条件
自下而上搜索就可
然后输出dp[1][1];
代码:
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<iostream>
#include<stack>
#include<queue>
#include<limits>
using namespace std;
#define debug 0
const int maxRow=20+5,maxCol=1000+5;
int dir[2][2]={{0,1},{1,0}};
int data[maxRow][maxCol],caseNum,n,m;
bool judge(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m)
return true;
return false;
}
void Do()
{
int temp;
for(int i=n;i>=1;i--)
for(int j=m;j>=1;j--)
{
if(i==n&&j==m)
continue;
temp=INT_MIN;
for(int k=0;k<2;k++)
{
int fx=i+dir[k][0],fy=j+dir[k][1];
if(judge(fx,fy))
temp=max(temp,data[fx][fy]);
}
for(int p=2;p*j<=m;p++)
{
if(p*j!=j+1)
temp=max(temp,data[i][p*j]);
}
data[i][j]+=temp;
}
printf("%d\n",data[1][1]);
}
int main()
{
#if debug
freopen("in.txt","r",stdin);
#endif // debug
while(~scanf("%d",&caseNum))
{
while(caseNum--)
{
memset(data,0,sizeof(data));
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d",&data[i][j]);
Do();
}
}
return 0;
}