多线程dp hdu2686 Matrix

传送门:点击打开链接

题意:给一个矩阵,刚开始两个点都在(1,1),然后一起出发,只能向右走或者向下走,只能在(n,n)汇合,在到终点之前两个不能在同一个格子内,得分就是两条路径的数字之和。求得分最大。

因为数据比较小,所以可以直接开一个dp[x1][y1][x2][y2]来表示一个点在(x1,y1)另一个点在(x2,y2)时的最大得分

然后利用记忆化搜索递推就能得到答案了

#include<map>
#include<set>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;

const int MX = 30 + 5;

int n;
int dp[MX][MX][MX][MX], A[MX][MX];

int DP(int x1, int y1, int x2, int y2) {
    int &d = dp[x1][y1][x2][y2];
    if(d) return d;

    if(x1 > 1) d = max(d, DP(x1 - 1, y1, x2 - 1, y2));
    if(y2 > 1) d = max(d, DP(x1, y1 - 1, x2, y2 - 1));
    if(x1 > 1 && y2 > 1) d = max(d, DP(x1 - 1, y1, x2, y2 - 1));
    if(!(y1 - 1 == y2 && x2 - 1 == x1)) d = max(d, DP(x1, y1 - 1, x2 - 1, y2));
    d += A[x1][y1] + A[x2][y2];
    return d;
}

int main() {//FIN;
    while(~scanf("%d", &n)) {
        memset(dp, 0, sizeof(dp));

        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                scanf("%d", &A[i][j]);
            }
        }

        printf("%d\n", DP(n - 1, n, n, n - 1) + A[1][1] + A[n][n]);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 07:28:09

多线程dp hdu2686 Matrix的相关文章

HDU-2686 Matrix(多线程DP?)2017寒假集训

题意:给一个矩阵,求(1,1)到(n,n)的两条路径(不能相交),求能取到的最大值 数据范围:2 <= n <= 30,矩阵上的数 < 100 思路:记得在kuangbin最短路专题里有个要求差不多的题,当时写不出来,查题解是最大流???? 然后问了大佬,说这题也可以网络流做,不过呢...然后我就了解到了这个叫多线程DP的东西 多线程..????这不是C语言的那啥玩意...吗?课设好像还要用呢orz 其实这里是指DP数组存分别在两个点的状态能走出多少的最大值,走的时候不走到一个点上就行了

HDU 2686 Matrix 多线程dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 思路:多线程dp,参考51Nod 1084:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 注:这道题用滚动数组优化反而WA,压到三维即可 代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 int ans[30][30],dp[60][30][3

codevs1169, 51nod1084(多线程dp)

先说下codevs1169吧, 题目链接: http://codevs.cn/problem/1169/ 题意: 中文题诶~ 思路: 多线程 dp 用 dp[i][j][k][l] 存储一个人在 (i, j), 一个人在 (k, l) 位置时对答案的最大贡献, 那么动态转移方程式为: dp[i][j][k][l] = max(max(dp[i - 1][j][k - 1][l], dp[i - 1][j][k][l - 1]), max(dp[i][j - 1][k - 1][l], dp[i]

【日常学习】【棋盘DP】【多线程DP】codevs1169 传纸条题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看 这是经典的老题了 来源是08年NOIP提高组 上题目 题目描述 Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵

NOIP 2008 传纸条 NOIP 2000 方块取数 多线程DP

思路都是一样,建立一个四维dp然后跑一发就完了 当然,也可以像我这么帅的人,降成三维再傻傻的跑一发啦啦啦~ #include<iostream> #include<stdio.h> #include<math.h> #include<string.h> #include<memory.h> using namespace std; #define maxn 205 int dp[maxn][maxn][maxn]; int map[maxn][m

51nod 1503 多线程dp

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 1503 猪和回文 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处于第r行第c列的格子用(r,c)表示. 刚开始的时候猪站在(1,1),

FZU 2234 牧场物语【多线程dp】

 Problem 2234 牧场物语  Problem Description 小茗同学正在玩牧场物语.该游戏的地图可看成一个边长为n的正方形. 小茗同学突然心血来潮要去砍树,然而,斧头在小茗的右下方. 小茗是个讲究效率的人,所以他会以最短路程走到右下角,然后再返回到左上角.并且在路上都会捡到/踩到一些物品,比如说花朵,钱和大便等. 物品只能被取最多一次.位于某个格子时,如果格子上还有物品,就一定要取走.起点和终点上也可能有物品. 每种物品我们将为其定义一个价值,当然往返之后我们取得的物品的价值

洛谷 P1004 方格取数 【多线程DP/四维DP/】

题目描述(https://www.luogu.org/problemnew/show/1004) 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 0 0 0 4 0 0 0 0 15 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . B 某人

多线程DP (要一起行动才可以)

题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): 某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点.在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0). 此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大. 输入描述 Input Description 输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个