HDU-2845 Beans 动态规划
对于每一个点由其上一步的结点传递过来,存在最优子结构,即对于正确路径的上的任意一点将都是最优的,并且存在最优子结构。保留最优值的时候注意方法,不然TLE。
代码如下:
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <iostream> #define MAXN 200000 using namespace std; int N, M, dp[MAXN+5], G[MAXN+5], mm[MAXN+5]; inline int max(int x, int y) { return x > y ? x : y; } void update(int x, int y) { dp[x*M+y] = G[x*M+y]; for (int i = x-3; i <= x-2; ++i) { if (i < 0) { continue; } dp[x*M+y] = max(dp[x*M+y], mm[i]+G[x*M+y]); } dp[x*M+y] = max(dp[x*M+y], mm[x]+G[x*M+y]); } int DP() { int res = 0; for (int i = 0; i < N; ++i) { mm[i] = 0; for (int j = 0; j < M; ++j) { update(i, j); if (j > 0) { mm[i] = max(mm[i], dp[i*M+j-1]); } } mm[i] = max(mm[i], dp[i*M+M-1]); res = max(res, mm[i]); } return res; } int main() { while (scanf("%d %d", &N, &M) == 2) { memset(dp, 0, sizeof (dp)); for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { scanf("%d", &G[i*M+j]); } } printf("%d\n", DP()); } return 0; }