51Nod 1084 矩阵取数问题 V2 ( 多进程dp
2018-03-19 23:13
316 查看
1084 矩阵取数问题 V2
题目描述
一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上。第1遍时只能向下和向右走,第2遍时只能向上和向左走。两次如果经过同一个格子,则该格子的奖励只计算一次,求能够获得的最大价值。例如:3 * 3的方格。
1 3 3
2 1 3
2 2 1
能够获得的最大价值为:17。1 -> 3 -> 3 -> 3 -> 1 -> 2 -> 2 -> 2 -> 1。其中起点和终点的奖励只计算1次。
输入
第1行:2个数M N,中间用空格分隔,为矩阵的大小。(2 <= M, N <= 200)第2 - N + 1行:每行M个数,中间用空格隔开,对应格子中奖励的价值。(1 <= A[i,j] <= 10000)
输出
输出能够获得的最大价值。样例
Input示例 3 3 1 3 3 2 1 3 2 2 1 Output示例 17
题意
多线程DP 不会写 放上讨论区题解http://www.51nod.com/question/index.html#!questionId=852
寒假时候写的题了 现在再写还是出错,,,
AC代码
#include<bits/stdc++.h> using namespace std; #define LL long long #define ULL unsigned long long const int MAXN = 2e2+10; /*-------------------------------------*/ struct node { int x; node(int _x=0):x(_x){} bool operator <(const node &r)const { return x > r.x; } }p[100]; int mps[MAXN][MAXN], dp[MAXN*2][MAXN][MAXN]; int main() { int n, m; cin >> m >> n; for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { cin >> mps[i][j]; } } //dp[1][1][1] = mps[1][1]; for(int k = 1; k <= n+m; k++) { for(int i = 1; i <= n; i++) { for(int p = 1; p <= n; p++) { if(k-p>=1 && k-i>=1) { dp[k][i][p] = max(max(dp[k-1][i][p-1],dp[k-1][i][p]),max(dp[k-1][i-1][p],dp[k-1][i-1][p-1])) + mps[p][k-p] + mps[i][k-i]; if(p == i) dp[k][i][i] -= mps[i][k-i]; } } } } cout << dp[n+m] << endl; return 0; }
相关文章推荐
- 51nod 1084 矩阵取数问题 V2(dp)
- 51nod 1084 矩阵取数问题 V2(dp)
- 51nod 1084 矩阵取数问题 V2 dp
- 51Nod 1084 矩阵取数问题 V2(多进程DP模板)
- hdu 4975 最大流问题解决队伍和矩阵,利用矩阵dp优化
- dp--矩阵取数问题
- 【51Nod】1083 - 矩阵取数问题(dp)
- 51nod 1083 矩阵取数问题 ( dp
- 51nod oj 1084 矩阵取数问题 V2 【双回路矩阵DP】
- DP---矩阵连乘问题
- 51Nod 1083 矩阵取数问题 (DP)
- Multiplication Puzzle(区间DP:类似矩阵连乘问题的DP模板)
- 1084 矩阵取数问题 V2 -
- [多线程DP 费用流] 51Nod 1084 矩阵取数问题 V2 & POJ 3422 Kaka's Matrix Travels
- 51nod 1038 矩阵取数问题 (DP)
- 【BZOJ4870】组合数问题(SHOI2017)-矩阵优化DP
- 矩阵连乘问题 DP
- 51nod 1084:矩阵取数问题 V2
- 51Nod 1083 矩阵取数问题(简单DP)
- DP 矩阵连乘问题