nyoj--61 传字条(一)(多线程dp)
来源:互联网 发布:c语言深度剖析 pdf 编辑:程序博客网 时间:2024/04/29 14:18
nyoj 61
题意
题解
多线程dp,get new skill~
定义状态:
状态转移:
五维数组好可怕= =
两条路径都从左上角出发,每一步都只能向下或者向右,那么便有
新的状态转移:
解为:
#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <string>#include <map>using namespace std;#define setzero(arr) memset(arr, 0, sizeof(arr))const int maxn = 55;int dp[2 * maxn][maxn][maxn], a[maxn][maxn];int t, n, m;inline int Max(int a, int b, int c, int d){ return max(max(a, b), max(c, d));}void test(int a, int b, int c){ for(int i = 1; i <= a; ++i){ cout << "flag: " << i <<endl; for(int j = 1; j <= b; ++j){ for(int k = 1; k <= c; ++k) cout << dp[i][j][k] << " "; cout << endl; } cout << endl; }}void dpSolve(int r, int c){ setzero(dp); for(int k = 2; k < r + c; ++k) //一共要走 (r - 1 + c - 1) 步 { //x1走“下线”,x2走“上线”,以横坐标标识 for(int x1 = 1; x1 <= r; ++x1) for(int x2 = 1; x2 <= r; ++x2){ int y1 = k - x1, y2 = k - x2; if(y1 <= 0 || y1 > c || y2 <= 0 || y2 > c || x1 == x2) continue; dp[k][x1][x2] = Max(dp[k - 1][x1 - 1][x2 - 1], dp[k - 1][x1 - 1][x2], dp[k - 1][x1][x2 - 1], dp[k - 1][x1][x2]) + a[x1][y1] + a[x2][y2]; } } //test(r + c - 1, r, r); cout << dp[r + c - 1][r - 1][r] << endl; //cout << dp[r + c - 1][r][r - 1] << endl;}//another versionvoid dpSolve1(int r, int c){ setzero(dp); for(int k = 3; k < r + c; ++k) { for(int x1 = 1; x1 <= r; ++x1) for(int x2 = x1 + 1; x2 <= r; ++x2){ //here differ int y1 = k - x1, y2 = k - x2; if(y1 <= 0 || y1 > c || y2 <= 0 || y2 > c || x1 == x2) continue; dp[k][x1][x2] = Max(dp[k - 1][x1 - 1][x2 - 1], dp[k - 1][x1 - 1][x2], dp[k - 1][x1][x2 - 1], dp[k - 1][x1][x2]) + a[x1][y1] + a[x2][y2]; } } int ans = Max(dp[r + c - 1][r - 1][r], dp[r + c - 1][r - 1][r - 1], dp[r + c - 1][r][r], dp[r + c- 1][r][r - 1]); cout << ans << endl;}int main(){ for(cin >> t; t--; ) { cin >> m >> n; for(int i = 1; i <= m; ++i) for(int j = 1; j <= n; ++j) cin >> a[i][j]; dpSolve1(m, n); } return 0;}
0 0
- nyoj--61 传字条(一)(多线程dp)
- DP——NYOJ 题目61 传纸条(一)
- Nyoj-61 传纸条(一)(双线dp)
- NYOJ 61 传纸条(一)(双线dp)
- nyoj 61 传纸条(一)双线程DP
- nyoj 61 传纸条(一)【 双线程 DP】
- nyoj 传纸条(一) 61 双线DP
- NYOJ 61 传纸条(一)(双线程dp模板)
- NYOJ 61:传纸条(一)(三维DP)
- NYOJ 61 传纸条(一)(双线程dp)
- nyoj 61 传纸条(一)(双线DP)
- nyoj 61 传纸条(一) nyoj 712探寻宝藏 双线dp
- NYOJ - 传纸条(一)(DP)
- NYOJ 传纸条(一) 双向dp
- 浅谈双线程dp (nyoj61 nyoj712)经典【传字条】和【探 寻 宝 藏】
- NYOJ 61 传纸条 && NYOJ 712 探寻宝藏 -- 双线dp
- NYOJ-传纸条(一)、探寻宝藏【双路(线)DP】
- NYOJ 61 传纸条(一)
- 关于N-Gram模型
- Linux Shell 1>/dev/null 2>&1 含义
- JavaScript控制页面显示和隐藏带案例
- HQL执行的三种方式
- 变量、作用域和内存问题
- nyoj--61 传字条(一)(多线程dp)
- hdoj--1877--又一版 A+B(水题)
- TLS线程局部存储
- Java 数组实现冒泡排序
- OJ提交题目中的语言选项里G++与C++的区别
- Javascript中各种高度宽度解读
- hdoj 欧拉回路 1878 (并查集)
- 01背包问题
- hdu3033I love sneakers!【分组背包】每组至少取一个