http://acm.hdu.edu.cn/showproblem.php?pid=2845
审题
取一个点 那么相邻行的点和 这一行和它左右相连的点就不能再取了
涉及取舍的问题 整体无法考虑 只能从局部出发-->>动态规划
可惜没看出来 ----要进行状态压缩 就是很标准的dp了
1、先多每一行进dp求得每一行可以得到的最大值
2、在取对n行进行dp得到最终的最大值
所以两类其实方式都是一样的
以求每一行最大值为例 culumn[MAXN];
定义dp[i] : 前i列(含)可以取 得的最大值
转移方程dp[i] = max(dp[i-2] + culumn[i], dp[i-1])
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 5 6 using namespace std; 7 8 9 int N, M; 10 long long culumn[200004]; 11 long long row[200004]; 12 long long dp[200004]; 13 int main() 14 { 15 freopen("in.txt" ,"r", stdin); 16 while(~scanf("%d%d" ,&N, &M)) 17 { 18 memset(dp, 0, sizeof(dp)); 19 memset(row, 0, sizeof(row)); 20 for (int i = 0; i < N; i++) 21 { 22 for (int j = 0; j < M; j++) 23 { 24 long long tmp = 0; 25 scanf("%lld", &tmp); 26 if (j == 0) row[j] = tmp; 27 else if (j == 1) row[j] = max(tmp, row[j-1]); 28 else row[j] = max(row[j-2]+tmp, row[j-1]); 29 } 30 culumn[i] = row[M-1]; 31 } 32 dp[0] = culumn[0]; 33 dp[1] = max(dp[0], culumn[1]); 34 for (int i = 2; i < N; i++) 35 { 36 dp[i] = max(culumn[i]+dp[i-2], dp[i-1]); 37 } 38 printf("%lld\n", dp[N-1]); 39 } 40 return 0; 41 }
时间: 2024-12-20 18:17:46