CH5103 传纸条【线性dp】
5103 传纸条 0x50「动态规划」例题
描述
给定一个 N*M 的矩阵A,每个格子中有一个整数。现在需要找到两条从左上角 (1,1) 到右下角 (N,M) 的路径,路径上的每一步只能向右或向下走。路径经过的格子中的数会被取走。两条路径不能经过同一个格子。求取得的数之和最大是多少。N,M≤50。
输入格式
第一行有2个用空格隔开的整数n和m,表示有n行m列(1<=n,m<=50)。
接下来的n行是一个n*m的矩阵,每行的n个整数之间用空格隔开。
输出格式
一个整数,表示答案。
样例输入
3 3
0 3 9
2 8 5
5 7 0
样例输出
34
数据范围与约定
- 30%的数据满足:1<=m,n<=10
100%的数据满足:1<=m,n<=50
来源
CCF NOIP2008 T3
题意:n*m的格子里每个格子有一个权值,从(1,1)走到(n,m)两条路,(只能向下或者向右)求路径之和。走过的格子只算一次权值。
思路:
把“路径长度”即当前走过的步数作为DP的“阶段”。【因为只能向下或向右,走到(n,m)时的路径长度是n+m-2】
每一个阶段中,把两条路径同时扩展一步,路径长度增加1,从而转移到下一个阶段。
还需确定两条路径当前的末尾位置。并且 x1+y1 = x2 + y2 = i + 2
所以就可以用三维dp维护,每次有4种扩展方式。并且要考虑扩展后是否两个点坐标相同。
目标是dp[n+m-2][n][n]
#include <bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<map> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL; int n, m;
const int maxn = ;
int g[maxn][maxn];
int dp[maxn * ][maxn][maxn] = {}; int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
scanf("%d", &g[i][j]);
}
} dp[][][] = g[][];
for(int i = ; i <= n + m - ; i++){
for(int x1 = ; x1 <= min(n, i + ); x1++){
for(int x2 = ; x2 <= min(n, i + ); x2++){
int y1 = i + - x1, y2 = i + - x2;
if(x1 == x2 && y1 == y2){
dp[i + ][x1][x2] = max(dp[i + ][x1][x2], dp[i][x1][x2] + g[x1][y1 + ]);
dp[i + ][x1 + ][x2 + ] = max(dp[i + ][x1 + ][x2 + ], dp[i][x1][x2] + g[x1 + ][y1]);
}
else{
dp[i + ][x1][x2] = max(dp[i + ][x1][x2], dp[i][x1][x2] + g[x1][y1 + ] + g[x2][y2 + ]);
dp[i + ][x1 + ][x2 + ] = max(dp[i + ][x1 + ][x2 + ], dp[i][x1][x2] + g[x1 + ][y1] + g[x2 + ][y2]);
} if(x1 == x2 + && y1 + == y2){
dp[i + ][x1][x2 + ] = max(dp[i + ][x1][x2 + ], dp[i][x1][x2] + g[x1][y1 + ]);
}
else{
dp[i + ][x1][x2 + ] = max(dp[i + ][x1][x2 + ], dp[i][x1][x2] + g[x1][y1 + ] + g[x2 + ][y2]);
} if(x1 + == x2 && y1 == y2 + ){
dp[i + ][x1 + ][x2] = max(dp[i + ][x1 + ][x2], dp[i][x1][x2] + g[x1 + ][y1]);
}
else{
dp[i + ][x1 + ][x2] = max(dp[i + ][x1 + ][x2], dp[i][x1][x2] + g[x1 + ][y1] + g[x2][y2 + ]);
}
}
}
}
printf("%d\n", dp[n + m - ][n][n]);
return ;
}
CH5103 传纸条【线性dp】的更多相关文章
- CH5103 [NOIP2008]传纸条[线性DP]
给定一个 N*M 的矩阵A,每个格子中有一个整数.现在需要找到两条从左上角 (1,1) 到右下角 (N,M) 的路径,路径上的每一步只能向右或向下走.路径经过的格子中的数会被取走.两条路径不能经过同一 ...
- 传纸条---(dp)
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mmm行nnn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了. ...
- P1006 传纸条[棋盘DP]
题目来源:洛谷 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接 ...
- [Luogu P1006]传纸条 (网格DP)
题面 传送门:https://www.luogu.org/problemnew/show/P1006 Solution 挺显然但需要一定理解的网络(应该是那么叫吧)DP 首先有一个显然但重要的结论要发 ...
- NOIP2008 传纸条(DP及滚动数组优化)
传送门 这道题有好多好多种做法呀……先说一下最暴力的,O(n^4的做法) 我们相当于要找两条从左上到右下的路,使路上的数字和最大.所以其实路径从哪里开始走并不重要,我们就直接假设全部是从左上出发的好啦 ...
- 洛谷P1006 传纸条【dp】
题目:https://www.luogu.org/problemnew/show/P1006 题意: 给定一个m*n的矩阵,从(1,1)向下或向右走到(m,n)之后向上或向左走回(1,1),要求路径中 ...
- NOIP2008传纸条[DP]
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- TYVJ 1011 NOIP 2008&&NOIP 2000 传纸条&&方格取数 Label:多线程dp
做题记录:2016-08-15 15:47:07 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- 传纸条(一)(双线程dp)
传纸条(一) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
随机推荐
- 用EA生成实体层代码
在个人版机房重构中.实体层的代码敲得有点儿烦了.不同的实体仅仅是命名不同.代码结构全然一样.遇到反复的事情,就该动动脑.想想办法了. 以下给大家介绍使用EA生成实体层的代码. 首先.建一个类,注意选择 ...
- ubuntu 16.04 安装 ITDB
其实标题本不应该是这个 之前也部署过itdb,这款软件本身不必多言,来自希腊的精品.最近因为单位需要,又要重新部署.前几年部署itdb的时候用的是ub14,但目前最新的是ub16,于是就部署呗.但在后 ...
- nodeJs should+mocha+istanbul 测试 遇到的坑
.istanbul 和 mocha 结合进行nodejs测试的时候最后执行 istanbul cover _mocha test.sqrt.js的时候报错 如图: 用 ../node_modules/ ...
- 关闭socket连接最好的方法
最好关闭连接的方法 `C S` `shutdown-WR ` `发送FIN` ` read-0发送ACK` ` ......` ` close` ` 发送FIN` `read-0` `close` ` ...
- gitolite
gitolite: https://github.com/sitaramc/gitolite https://github.com/sitaramc/gitolite/tags
- 使用JavaScript获取select元素选中的value和text
示例代码如下(js直接写在了html里面,没有写在一个单独的外部文件中): <!DOCTYPE html> <html> <head> <meta name= ...
- C#调用系统API
API简介 1) C#中的简单数据类型与API中的数据类型对应关系 2) 如何在调用API时传递复杂参数:封装类.结构和联合 3) 如何调用API 4) 如何确保成功调用API
- Emmet快速编写HTML代码
缩写是Emmet工具的核心,这些特殊的表达式通过Emmet解析并转化为结构化的代码块,而语法用CSS选择器,HTML标签和一些Emmet特定的代码生成,所以对于任何一个前端开发人员都可以很容易地掌握和 ...
- 一个美国人对"智能制造"的思考!
世界上制造业最强的国家仍然是美国!如今,国内工业4.0概念讨论日益喧嚣,中德合作如火如荼,但我们不能否认这个事实. “ 当下,美国似乎失去了世界第一制造大国的称号,而中国的企业也正面临产值下滑.利润下 ...
- 第二百四十九节,Bootstrap附加导航插件
第二百四十九节,Bootstrap附加导航插件 学习要点: 1.附加导航插件 本节课我们主要学习一下 Bootstrap 中的附加导航插件 一.附加导航 注意:此插件要使用 bootstrap3.0. ...