蓝桥杯--算法训练 方格取数(多线程dp)
2016-03-13 15:22
357 查看
题意
取过的数会变成0,因此两条路径相交的部分只能取一次。#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 12; int dp[maxn][maxn][maxn][maxn], g[maxn][maxn]; int n; void dpSolve() { /*for(int k = 2; k < n + n; ++k) { for(int x1 = 1; x1 <= n; ++x1){ for(int x2 = 1; x2 <= n; ++x2){ int y1 = k - x1, y2 = k - x2; if(y1 < 1 || y1 > n || y2 < 1 || y2 > n) continue; dp[k][x1][x2] = max(max(dp[k - 1][x1][x2], dp[k - 1][x1 - 1][x2 - 1]), max(dp[k - 1][x1 - 1][x2], dp[k - 1][x1][x2 - 1])); if(y1 == y2) dp[k][x1][x2] += g[x1][y1]; else dp[k][x1][x2] += g[x1][y1] + g[x2][y2]; } } } cout << dp[n + n - 1] [n - 1] << endl;*/ for(int x1 = 1; x1 <= n; ++x1) { for(int y1 = 1; y1 <= n; ++y1) for(int x2 = 1; x2 <= n; ++x2) for(int y2 = 1; y2 <= n; ++y2){ dp[x1][y1][x2][y2] = max(max(dp[x1-1][y1][x2-1][y2], dp[x1-1][y1][x2][y2-1]), max(dp[x1][y1-1][x2-1][y2],dp[x1][y1-1][x2][y2-1])); if(x1 == x2 && y1 == y2) dp[x1][y1][x2][y2] += g[x1][y2]; else dp[x1][y1][x2][y2] += g[x1][y1] + g[x2][y2]; } } cout << dp << endl; } int main() { #ifdef LOCAL freopen("data.in", "r", stdin); #endif // LOCAL cin >> n; int a, b, c; while(cin >> a >> b >> c) { if(!a && !b && !c) break; g[a][b] = c; } dpSolve(); return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- checkbox 文字对齐问题
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 连号区间 蓝桥杯 算法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- 蓝桥杯——历届试题(1-10)
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- 2015 蓝桥杯第六届 省赛java A组第7题 扑克牌组合