hdu 2845 Beans dp
2015-08-04 21:34
295 查看
题意:n*m的格子取数,每次取x,y时,x+1和x-1这两行不能去,(x,y-1),(x,y+1)这两格不能取。求最后能取到的最大的值。
先对每行求最大不连续子段和,由于行数不能连续取,相等于再对列做一次求不连续子段和即可
先对每行求最大不连续子段和,由于行数不能连续取,相等于再对列做一次求不连续子段和即可
#include <bits/stdc++.h> #include <map> #include <set> #include <queue> #include <stack> #include <cmath> #include <time.h> #include <vector> #include <cstdio> #include <string> #include <iomanip> ///cout << fixed << setprecision(13) << (double) x << endl; #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 #define ls rt << 1 #define rs rt << 1 | 1 #define pi acos(-1.0) #define eps 1e-8 #define Mp(a, b) make_pair(a, b) #define asd puts("asdasdasdasdasdf"); typedef long long ll; //typedef __int64 LL; const int inf = 0x3f3f3f3f; const int N = 200010; int a , b , dp ; int n, m; int main() { while( ~scanf("%d%d", &n, &m) ) { for( int i = 1; i <= n; ++i ) { for( int j = 1; j <= m; ++j ) { dp[j] = 0; scanf("%d", &a[j]); } dp[0] = 0, dp[1] = a[1]; for( int j = 2; j <= m; ++j ) { dp[j] = max( dp[j-2]+a[j], dp[j-1] ); } b[i] = dp[m]; } memset( dp, 0, sizeof(dp) ); dp[1] = b[1]; for( int i = 2; i <= n; ++i ) { dp[i] = max( dp[i-2]+b[i], dp[i-1] ); } printf("%d\n", dp ); } return 0; }
相关文章推荐
- JQuery中$.ajax()方法参数详解
- 一图看尽Docker容器文件系统
- (转)Android--sharepreference总结
- android音乐播放器的音频焦点控制
- linux 下用户管理命令基本应用
- DFS
- 变形课
- 【罗辑思维】西方军队胜利的秘密
- 八皇后问题
- Fragment 在屏幕切换上的应用
- 转:HTTP长连接和短连接原理浅析
- 2015 Multi-University Training Contest 5
- 【西祠日志】【15】周二
- POJ 2955:Brackets
- DPDK 内存管理(三)(rte_malloc 内存管理)
- Python获取本机外网IP
- SQL事务的四种隔离级别和MySQL多版本并发控制
- LVS+Keepalived实现MySQL从库读操作负载均衡
- LVS+Keepalived实现MySQL从库读操作负载均衡
- 1.1 kettle 抽取文本文件