您的位置:首页 > 其它

HDU_2571 命运 【DP】

2018-02-06 10:19 218 查看
题目链接

题目描述

主人公小毅要从n*m迷宫的左上角到右下角找大魔王去救MM,迷宫的每一个格子都受到幸运女神眷恋或者痛苦魔王的诅咒,所以每个格子都对应一个值,走到那里便自动得到了对应的值。小毅想要到达大魔王的地方得到最大值。(题目规定:小毅只能向右或者向下走,向下一次只能走一格。但是如果向右走,则每次可以走一格或者走到该行的列数是当前所在列数倍数的格子)。

解题思路

从左上角到右下角,走到迷宫对应位置获得对应值,要求得到的值最大,首先想到的就是数塔问题。但是题目规定的迷宫中的值有正有负,并且不仅仅是可以向下走和向右走。这道题如果迷宫中的值有负数,那么dp就不能简单得刷新成0了,需要刷新为负无穷,另外需要对其走路的方式进行额外的考虑。详细实现看代码部分。

代码部分

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define inf -0x3f3f3f
using namespace std;
const int maxn = 1e3 + 10;
int main()
{
int t;
cin >> t;
while(t --)
{
int a[25][maxn] = {0};
int dp[25][maxn] = {0};
int m, n;
cin >> m >> n;

for(int i = 1; i <= m; ++ i)
for(int j = 1; j <= n; ++ j)
cin >> a[i][j];

for(int i = 0; i <= n; ++ i)
dp[0][i] = inf;
for(int i = 0; i <= m; ++ i)
dp[i][0] = inf;
dp[0][1] = dp[1][0] = 0;

for(int i = 1; i <= m; ++ i)
{
for(int j = 1; j <= n; ++ j)
{
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
for(int k = 2; k <= n; ++ k)
{
if(j % k == 0)
{
dp[i][j] = max(dp[i][j], dp[i][j / k]);
}
}
dp[i][j] += a[i][j];
}
}
cout << dp[m]
<< endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: