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; }
相关文章推荐
- hdu 2571 命运 简单DP
- HDU 2571 命运(简单DP)
- Hdu 2571 命运(简单DP)
- HDU 2571 命运 水DP
- HDU dp 2571 命运
- hdu 2571 命运(DP)
- [HDU] 2571命运 - 最基本的入门dp
- HDU:2571 命运(DP)
- HDU 2571 命运 (简单DP)
- HDU-2571-命运【矩阵DP】
- hdu 2571 命运【dp】
- HDU 2571 命运 (简单DP)
- 【DP|水】HDU-2571 命运
- HDU - 2571 命运(简单DP)
- HDU 2571 命运 DP
- 命运 HDU - 2571 【DP】
- HDU 2571 命运 (入门dp)
- HDU 2571 命运(dp)
- HDU 2571 命运(dp)
- HDU 2571 命运 (DP)