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列的矩阵,而小渊和小轩被安排在矩阵对角线的两端, ...
随机推荐
- Day2-Python基础2---字符串操作
一.字符串操作 特性:不可修改 name = "my \tname is {name} and i am {year} old" #首字母大写.capitalize print(n ...
- ThreadPoolExecutor的corePoolSize和maximumPoolSize
按照JDK文档的描述, 如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程 如果池中的线程数>corePoolSize and <max ...
- mybatis 学习四(下) SQL语句映射文件增删改查、参数、缓存
2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id="getStudent" paramet ...
- #pragma pack 在BITMAP结构体定义中的使用
BITMAP位图文件主要分为如下3个部分: 块名称 对应Windows结构体定义 大小(Byte) 文件信息头 BITMAPFILEHEADER 14 位图信息头 BITMAPINFOHEADER 4 ...
- 反射+属性标签 通用Excel导入导
在做通用导入导出的时候,最关键的应该就是实体导出导入的顺序了,但是编译器在编译的时候又无法自定义属性编译的顺序,所以需要一个自定义的特性标签来指定实体类导出的顺序,然后通过自定义的比较器将属性排序 因 ...
- python中的 ' ' 和 " "
#!/usr/bin/python import MySQLdb try: conn = MySQLdb.connect(host = 'localhost', user = 'root', pass ...
- MessageBox如何输出整数
int cx=10;CString s;s.Format(_T("整数是:%d"),cx);MessageBox(s);
- 修改Windows帐户密码,导致Sql Server 2000无法启动
修改Windows帐户密码,导致Sql Server 2000无法启动. --现象以管理员或同等权限用户登录 Windows XP,建立 Sql Server 2000 数据库.之后,在修改此 Win ...
- JSP 按钮点击,onclick事件中的AJAX不执行可能的原因
<button onclick="deleteAccount()" >删除</button> 缺少了 type="button" &l ...
- 经典的CSS代码(转)
Web开发技术每年都在革新,浏览器已逐渐支持CSS3特性,并且网站设计师和前端开发者普遍采用这种新技术进行设计与开发.但仍然有一些开发者迷恋着一些CSS2代码. 分享20段非常专业的CSS2/CSS3 ...