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][j - 1][k][l - 1])) + a[i][j] + a[k][l]
注意: 如果 (i, j) 和 (k, l) 相同的话只能 a[i][j], a[k][l] 只计算一个
代码:
#include <iostream>
using namespace std; const int MAXN = ;
int a[MAXN][MAXN], dp[MAXN][MAXN][MAXN][MAXN]; int main(void){
int n, m;
cin >> n >> m;
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
cin >> a[i][j];
}
}
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
for(int k = ; k <= n; k++){
for(int l = ; l <= m; l++){
dp[i][j][k][l] = max(max(dp[i - ][j][k - ][l], dp[i - ][j][k][l - ]), max(dp[i][j - ][k - ][l], dp[i][j - ][k][l - ]));
if(i != k || j != l) dp[i][j][k][l] += a[k][l];
dp[i][j][k][l] += a[i][j];
}
}
}
}
cout << dp[n][m][n][m] << endl;
return ;
}
51nod10084
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084
这道题和上面那题差不多,不过数据范围更大,用四维 dp 的话无论时间复杂度还是空间复杂度都是不允许的
可以发现,如果记录一下步数的话,可以根据步数和行数得出列数,那么也就和上面的差不多了
用 dp[i][x1][x2] 记录第 i 步时第一个人走到第 x1 行, 第二个人走到第 x2 行时对答案的最大贡献
那么动态转移方程式为:
dp[i][x1][x2] = max(max(dp[i - 1][x1][x2], dp[i - 1][x1][x2 - 1]), max(dp[i - 1][x1 - 1][x2], dp[i - 1][x1 - 1][x2 - 1])) + a[x1][y1] + a[x2][y2]
其中 y1 = i - x1, y2 = i - x2
注意: (x1, y1) 和 (x2, y2) 相同时 a[x1][y1], a[x2][y2] 只能计算一个
还有一个坑就是输入 n, m 的顺序是 m, n // 坑了我半天
代码:
#include <iostream>
using namespace std; const int MAXN = 2e2 + ;
int a[MAXN][MAXN], dp[MAXN << ][MAXN][MAXN]; int main(void){
int n, m;
cin >> m >> n;
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
cin >> a[i][j];
}
}
for(int i = ; i <= n + m; i++){
for(int x1 = ; x1 <= min(n, i); x1++){
int y1 = i - x1;
for(int x2 = ; x2 <= min(n, i); x2++){
int y2 = i - x2;
dp[i][x1][x2] = max(max(dp[i - ][x1][x2], dp[i - ][x1][x2 - ]), max(dp[i - ][x1 - ][x2], dp[i - ][x1 - ][x2 - ]));
if(x1 != x2 || y1 != y2) dp[i][x1][x2] += a[x2][y2];
dp[i][x1][x2] += a[x1][y1];
}
}
}
cout << dp[n + m][n][n] << endl;
return ;
}
codevs1169, 51nod1084(多线程dp)的更多相关文章
- Matrix(多线程dp)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 2686 Matrix 多线程dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 思路:多线程dp,参考51Nod 1084:http://www.51nod.com/onlin ...
- 51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 1084 矩阵取数问题 V2 基准时间限制:2 秒 空 ...
- 8786:方格取数 (多线程dp)
[题目描述] 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点.在走 ...
- TYVJ 1011 NOIP 2008&&NOIP 2000 传纸条&&方格取数 Label:多线程dp
做题记录:2016-08-15 15:47:07 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- (多线程dp)Matrix (hdu 2686)
http://acm.hdu.edu.cn/showproblem.php?pid=2686 Problem Description Yifenfei very like play a num ...
- NOIP 2008 传纸条 NOIP 2000 方块取数 多线程DP
思路都是一样,建立一个四维dp然后跑一发就完了 当然,也可以像我这么帅的人,降成三维再傻傻的跑一发啦啦啦~ #include<iostream> #include<stdio.h&g ...
- 51nod 1503 猪和回文(多线程DP)
虚拟两个点,一个从左上角开始走,一个从右下角开始走,定义dp[i][j][k]表示走了i步后,第一个点横向走了j步,第二个点横向走了k步后形成的回文方法种数. 转移方程显然可得,然后滚动数组搞一搞. ...
- CodeVS1169 传纸条 [DP补完计划]
题目传送门 题目描述 Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端, ...
随机推荐
- Java并发 两个线程交替执行和死锁
今天看到一个题:两个线程交替打印奇数和偶数,即一个线程打印奇数,另一个打印偶数,交替打印从1到100.想了下有多重实现方法. wait和notify方法: public class OddEven { ...
- 关于HTML标签中的一些容易忘记常用样式属性
样式说明--样式: margin, margin-top/left/bottom/right -- 外边距; padding, padding-top/left/botton/right -- 内边距 ...
- Python内置函数:read()
文章转载于:http://blog.csdn.net/sxingming/article/details/51337768(博主:快递小哥) 1> >>> f=open(r&q ...
- C# winfrom FastReport Print
1.引用 using FastReport; using FastReport.Barcode; 2.code private void toolStripButtonPrint_Click(obje ...
- 侯捷STL学习(二)--序列容器测试
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标 ...
- Python-使用unrar库时Couldn't find path to unrar library的解决办法
在Pycharm安装完unrar后,还要安装rar官方的库 不然运行的时候会抛出Couldn't find path to unrar library的错误 Windows: 下载rarlib的库文件 ...
- Android 4学习(5):概述 - Android应用程序的生命周期
参考:<Professional Android 4 Application Development> Android应用程序生命周期 Android应用程序无法控制自己的生命周期,因此它 ...
- LAMP 3.0 mysql配置讲解
mysql 安装好后,我们是从安装包的 support-files 里面复制过来一个模板配置文件,默认 mysql 配置文件是在/etc/my.cnf 下,其实这个路径或者文件名字我们是可以修改的,在 ...
- python之数据库的操作(课前准备)
数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 上面的就是数据库的定义. 何为数据库,简单的来说,就是我们的大型数据的存放地点. 而我们学习的呢就是数据库的访问层的制作. 何为 ...
- python学习笔记(1)python下载及运行
进入https://www.python.org/官网下载python,根据需要选择2.*或3.*版本 安装完将安装目录添加到环境变量path中 运行cmd,输入python出现版本号即配置成功 下载 ...