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行 ...
随机推荐
- c#取得post和get的数据和模拟发送
可以放在控制器的入口函数中,这样载入就会被调用 asp.net mvc,get+post: public ActionResult Index() { ) { foreach (var item in ...
- ntoj 808 蚂蚁的难题(八)
蚂蚁的难题(八) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 蚂蚁是一个古玩爱好者,他收藏了很多瓶瓶罐罐. 有一天,他要将他的宝贝们一字排开, 摆放到一个长度为L的展 ...
- 模拟元素的title属性,自定义Vue指令
function showTitle(el, title) { const popover = getPopover() const popoverStyle = popover.style if ( ...
- 方程式漏洞之复现window2008/win7 远程命令执行漏洞
前几天就想写的,因为一些缘故就没写.此次是在外网环境下进行的.大家在内网中也一个样. 方法: 使用Eternalblue模块,剑测是否有漏洞然后msf生成一个dll直接反弹shell. PS:win版 ...
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
// test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 网桥bridge
1. 网桥基础 什么是网桥 网桥将多个网络在数据链路层连接起来.网桥的前身是集线器或中继器.网桥和集线器的区别:集线器上各端口都是共享同一条背板总线的,网桥的两个端口分别有一条独立的交换信道,不是共享 ...
- Python之美[从菜鸟到高手]--NotImplemented小析
今天写代码时无意碰到NotImplemented,我一愣.难道是NotImplementedError的胞弟,所以略微研究了一下. NotImplemented故名思议.就是"未实现&quo ...
- 关于Cocos2d-x中两个场景之间参数的传递
两个场景之间,有的时候要进行参数传递,如果想通过实例化出一个场景,从而得到属性和方法是不对的想法 你有两个场景,第一场景是用户登录界面,第二场景则是你登录后的界面,你如何将用户登录的值传到第二个场景呢 ...
- vs2010更新EF模型时报错
尝试从数据库进行更新时,遇到类型为“Microsoft.VSDesigner.Data.Local.ConnectionStringConverterServiceException”的异常.异常消息 ...
- javascript年月日日期筛选控件
来源:http://www.sucaihuo.com/js/1158.html demo:http://www.sucaihuo.com/jquery/11/1158/demo/