您的位置:首页 > 其它

杭电2571 命运

2013-01-19 17:02 274 查看

杭电2571 命运

http://acm.hdu.edu.cn/showproblem.php?pid=2571

/*



题意:从(1,1)点到(n,m)点,求最大命运值
解法:
DP问题,dp[i][j]表示(i,j)的最大命运值,从(1,1)到(n,m)一直算下去,dp
[m]即为所求
状态转移方程 dp[i][j]=MAX(dp[i][j/k],dp[i-1][j],dp[i][j-1])+value[i][j]

*/
#include<stdio.h>

#include<math.h>

int map[25][1005];

int dp[25][10005];

int getMax(int a,int b)

{

return a>b?a:b;

}

int main()

{

int C,n,m,i,j;

scanf("%d",&C);

while(C--)

{

scanf("%d%d",&n,&m);

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

scanf("%d",&map[i][j]);

dp[1][1]=map[1][1];

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

{

if(i==1&&j==1)

continue;

int max=-99999999;

for(int p=2;p<=j;p++)

if(j%p==0)

max=getMax(max,dp[i][j/p]);

if(j>1)

max=getMax(max,dp[i][j-1]);

if(i>1)

max=getMax(max,dp[i-1][j]);

dp[i][j]=max+map[i][j];

}

/* for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

{

printf("%d ",dp[i][j]);

if(j==m)

printf("\n");

}

*/

printf("%d\n",dp
[m]);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: