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行 ...
随机推荐
- jae的mongo数据库管理工具(原创)
园里前段时间有人介绍了京东的jae,申请了试用了一下,各种坑,勉强可以测试用用. jae一直没有Mongo数据库的管理工具,没办法,自己写了一个凑合着先用着. 使用方法: 1.修改配置:下载后面的程序 ...
- Unity3D学习(九):C#和C++的相互调用
前言 不知不觉已经一年了,这一年来一直忙于公司项目疯狂加班,很少有自己的时间写下东西.不过好在项目最近也步入正轨了,正好抽空写点东西记录下学到的一些东西. 公司项目是一个端游IP移植手游,端游是基于C ...
- 纯css3实现的win8加载动画
今天给大家分享一款纯css3实现的win8加载动画.在这款实例中动画效果完全由css3实现.一起看下效果图: 在线预览 源码下载 实现的代码. html代码: <div class=&quo ...
- java常用操作
1.properties文件中文转换 在cmd中进入到文件所在目录执行(其他操作请见命令帮助):native2ascii -reverse messages_zh_CN.properties b.t ...
- Repeater DataTable 折叠动态加载
网上关于Repeater折叠一般都是直接绑定上去,然后设置样式隐藏显示,可是这样是不太合理的,应该是客户需要的时候,你才去加载出来.所以,自己研究了一段时间,总结出下面的实现方案 首先是控件部分 &l ...
- CSS(六):盒子模型
一.什么是盒子模型 盒子模型是css中一个重要的概念,理解了盒子模型才能更好的排版. 从上图可以看到标准的盒子模型范围包括margin(外边距).border(边框).padding(内边距).con ...
- jrtplib编译指南
The library offers support for the Real-time Transport Protocol (RTP), The library uses the JThread ...
- jira集成fisheye代码深度查看工具安装绿色版
软件介绍: Fisheye 是一个源代码库深度查看软件,它可以挖掘源代码库中的有用信息,呈现在Web浏览器界面上,Fisheye优点: 1) Fisheye是一个基于Web的代码管理系统,可以与SVN ...
- google cloud之查看任务任务过程
点击侧边栏的logging
- MyBatis-Spring 使用总结
说明:Java-based Config. 不是通过 mybatis 的 SqlSessionFactoryBuilder 来创建 SqlSessionFactory ,而是通过 mybatis-sp ...