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】的更多相关文章

  1. CH5103 [NOIP2008]传纸条[线性DP]

    给定一个 N*M 的矩阵A,每个格子中有一个整数.现在需要找到两条从左上角 (1,1) 到右下角 (N,M) 的路径,路径上的每一步只能向右或向下走.路径经过的格子中的数会被取走.两条路径不能经过同一 ...

  2. 传纸条---(dp)

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mmm行nnn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了. ...

  3. P1006 传纸条[棋盘DP]

    题目来源:洛谷 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接 ...

  4. [Luogu P1006]传纸条 (网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P1006 Solution 挺显然但需要一定理解的网络(应该是那么叫吧)DP 首先有一个显然但重要的结论要发 ...

  5. NOIP2008 传纸条(DP及滚动数组优化)

    传送门 这道题有好多好多种做法呀……先说一下最暴力的,O(n^4的做法) 我们相当于要找两条从左上到右下的路,使路上的数字和最大.所以其实路径从哪里开始走并不重要,我们就直接假设全部是从左上出发的好啦 ...

  6. 洛谷P1006 传纸条【dp】

    题目:https://www.luogu.org/problemnew/show/P1006 题意: 给定一个m*n的矩阵,从(1,1)向下或向右走到(m,n)之后向上或向左走回(1,1),要求路径中 ...

  7. NOIP2008传纸条[DP]

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  8. TYVJ 1011 NOIP 2008&&NOIP 2000 传纸条&&方格取数 Label:多线程dp

    做题记录:2016-08-15 15:47:07 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

  9. 传纸条(一)(双线程dp)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

随机推荐

  1. c#取得post和get的数据和模拟发送

    可以放在控制器的入口函数中,这样载入就会被调用 asp.net mvc,get+post: public ActionResult Index() { ) { foreach (var item in ...

  2. ntoj 808 蚂蚁的难题(八)

    蚂蚁的难题(八) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 蚂蚁是一个古玩爱好者,他收藏了很多瓶瓶罐罐. 有一天,他要将他的宝贝们一字排开, 摆放到一个长度为L的展 ...

  3. 模拟元素的title属性,自定义Vue指令

    function showTitle(el, title) { const popover = getPopover() const popoverStyle = popover.style if ( ...

  4. 方程式漏洞之复现window2008/win7 远程命令执行漏洞

    前几天就想写的,因为一些缘故就没写.此次是在外网环境下进行的.大家在内网中也一个样. 方法: 使用Eternalblue模块,剑测是否有漏洞然后msf生成一个dll直接反弹shell. PS:win版 ...

  5. 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  6. 网桥bridge

    1. 网桥基础 什么是网桥 网桥将多个网络在数据链路层连接起来.网桥的前身是集线器或中继器.网桥和集线器的区别:集线器上各端口都是共享同一条背板总线的,网桥的两个端口分别有一条独立的交换信道,不是共享 ...

  7. Python之美[从菜鸟到高手]--NotImplemented小析

    今天写代码时无意碰到NotImplemented,我一愣.难道是NotImplementedError的胞弟,所以略微研究了一下. NotImplemented故名思议.就是"未实现&quo ...

  8. 关于Cocos2d-x中两个场景之间参数的传递

    两个场景之间,有的时候要进行参数传递,如果想通过实例化出一个场景,从而得到属性和方法是不对的想法 你有两个场景,第一场景是用户登录界面,第二场景则是你登录后的界面,你如何将用户登录的值传到第二个场景呢 ...

  9. vs2010更新EF模型时报错

    尝试从数据库进行更新时,遇到类型为“Microsoft.VSDesigner.Data.Local.ConnectionStringConverterServiceException”的异常.异常消息 ...

  10. javascript年月日日期筛选控件

    来源:http://www.sucaihuo.com/js/1158.html demo:http://www.sucaihuo.com/jquery/11/1158/demo/