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. Android 利用fastjson进行json解析

    package com.example.FastJson.util; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.Typ ...

  2. hdoj4864 Task (贪心)

    题目来源: 2014 Multi-University Training Contest 1--by FZU 题意:有N个机器和m个工作.机器和工作都有一个时间xi和价值yi,一个工作仅仅有满足xi和 ...

  3. Nginx配置优化详解

    如果你已经安装过Nginx并在生产环境中使用,那么Nginx配置优化你一定也要做,这样才能看到Nginx性能,本文就从基本配置优化开始到高层配置教你如何优化Nginx 大多数的Nginx安装指南告诉你 ...

  4. [POJ 1236][IOI 1996]Network of Schools

    Description A number of schools are connected to a computer network. Agreements have been developed ...

  5. AngularJS 和 Electron 构建桌面应用

    译]使用 AngularJS 和 Electron 构建桌面应用 原文: Creating Desktop Applications With AngularJS and GitHub Electro ...

  6. Linux系统(Ubuntu/Debian/RedHat/CentOS)超级简单的samba配置文件smb.conf

    1.超简单的smb.conf 该配置文件对Ubuntu和CentOS都好用. #============== Global Settings ============== [global] ## Br ...

  7. DOM方法 getElementsByName()方法

    http://www.imooc.com/code/1583 getElementsByName()方法 返回带有指定名称的节点对象的集合. 语法: document.getElementsByNam ...

  8. CodeForces 2A Winner

    Winner Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  9. Windows Phone Unit Test 环境搭建

    单元测试对工程质量带来的作用就不详细说明了,本文只讨论如何在WP开发环境下搭建测试工程     历史 从WP7时代官方是不支持UnitTest工程的,因此需要采用WPToolkitTest这个工程来实 ...

  10. with as 和update ,Delete,insert

    这个SQL写了很久的时间,感觉pgSQL的很是麻烦. with as 先命名一个表出来,就可以当成临时表用. WITH tmp AS ( SELECT MAX(mgi.inner_cd) AS inn ...