双线程DP的常识;DP的阶段问题;多阶段决策问题

传送门:$>here<$

题意

n*m的矩阵里,从左上角走到右下角(只能往右或往下),再从右下角走回左上角(只能往左或往上)。其中不能重复经过一个点。问最长路。

数据范围:$n,m \leq 50$

Solution

问题的转化

上一题有点类似。把往回走的那一条路径看做是从左上到右下的另一条路径。问题转化为求从左上到右下,两条不相交的路径,要求总长最长。

如何转移保证不重复走?

容易想到dp[i][j][a][b]表示第一个人走到(i,j),第二个走到(a,b)的最长路。

于是很快就想到了dp[i][j][a][b]=max{dp[i][j][a][b-1]...}这种转移方法了。这种转移方法的实质是令一个人不动,另一个人走一步。但是很遗憾,这种方法是不能保证不重复的。举一个反例,dp[2][2][1][2]这一个状态,如果从dp[2][2][1][1]转移而来,那么就有可能是(1,1)->(1,2)->(2,2)和(1,1)->(1,2)的叠加。可见(1,2)走了两次。

DP的阶段性

对于这种双线程的DP,往往要两个线程同时考虑。如果同时考虑的话,那么两人某一时刻的位置一定在同一条对角线上(仔细思考)。那么走到同一个点的意思就是两人相遇。那么只要将两人相遇的状态设为无限小,那么就自然避开了。

有了这一点性质(每一对角线作为阶段),DP是可以继续优化的。例如直接用dp[k][i][j]来表示状态。其中k表示第几条对角线,i,j是两人的横坐标。更进一步,由于多阶段DP的某一状态只取决于上一状态,还可以用滚动数组优化。那么就变成二维DP了。

透过题解看本质

双线程与阶段

从这道题里我发现双线程的情况往往同时考虑,并且以每一步决策作为一个阶段。和上一题不同,为什么上一题可以分开转移呢?是因为上一题以往前覆盖一个点作为一个阶段,两人走的步数可以是不一样的。而这道题两人的步数是一样,如果按照不一样考虑就会出现跟随的问题。

多阶段DP问题

将一个DAG分做一个多阶段的DAG往往更清晰。关键是要从题目中看出作为阶段的量。

my code

/*By DennyQi 2019*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
;
;
const int INF = 0x3f3f3f3f;
inline int Max(const int a, const int b){ return (a > b) ? a : b; }
inline int Min(const int a, const int b){ return (a < b) ? a : b; }
inline int read(){
    ; ; register char c = getchar();
    '); c = getchar());
    , c = getchar();
    ) + (x<<) + c - '; return x * w;
}
int n,m;
][][][],s[][];
int main(){
    n = read(), m = read();
    ; i <= n; ++i){
        ; j <= m; ++j){
            s[i][j] = read();
        }
    }
    memset(dp,-0x3f,sizeof(dp));
    dp[][][][] = ;
    ; i <= n; ++i){
        ; j <= m; ++j){
            ; a <= n; ++a){
                ; b <= m; ++b){
                    if(i==a && j==b){
                        continue;
                    }
                    dp[i][j][a][b] = max(max(dp[i-][j][a-][b],dp[i-][j][a][b-]),max(dp[i][j-][a-][b],dp[i][j-][a][b-]))+s[i][j]+s[a][b];
                }
            }
        }
    }
    printf(][m][n][m-]);
    ;
}

[洛谷P1006] 传纸条的更多相关文章

  1. 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏

    P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...

  2. 洛谷 P1006 传纸条 题解

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

  3. 洛谷p1006 传纸条 三维解法

    原题目如下 原地址https://www.luogu.com.cn/problem/P1006 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做 ...

  4. [NOIP2008] 提高组 洛谷P1006 传纸条

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

  5. 【动态规划】洛谷P1006传纸条

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

  6. 洛谷 P1006 传纸条 多维DP

    传纸条详解: 蒟蒻最近接到了练习DP的通知,于是跑来试炼场看看:发现有点难(毕竟是蒟蒻吗)便去翻了翻题解,可怎么都看不懂.为什么呢?蒟蒻发现题解里都非常详细的讲了转移方程,讲了降维优化,但这题新颖之处 ...

  7. Codevs 1169 == 洛谷 P1006 传纸条

    ---恢复内容开始--- 1169 传纸条 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小渊和小轩是好朋友也是同班同学,他 ...

  8. 洛谷 P1006 传纸条

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

  9. 洛谷P1006 传纸条 (棋盘dp)

    好气,在洛谷上交就过了,在caioj上交就只有40分 之前在51nod做过这道题了. https://blog.csdn.net/qq_34416123/article/details/8180902 ...

  10. 洛谷P1006 传纸条(多维DP)

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

随机推荐

  1. C# 实体类转json数据过滤掉字段为null的字段

    C# 实体类转json数据过滤掉字段为null的字段 语法如下: var jsonSetting = new JsonSerializerSettings {NullValueHandling = N ...

  2. nginx系列13:最少连接算法以及如何跨worker进程生效

    最少连接算法 使用最少连接算法可以使得nginx优先选择连接最少的上游服务器,需要用到upstream_least_conn模块. 如何跨worker进程生效 因为nginx是多进程结构的,默认多个w ...

  3. js循环语句

    1.for循环 for(语句1:语句2:语句3){ 代码块 } //语句1:初始化表达式; //语句2:条件表达式; //语句3:更新表达式; 2.for-in循环 for(x in object){ ...

  4. 关于elementui表单数字校验踩坑记

    需求:1.输入类型是数字.2.数字大小有限制.3.非必填 做法: <el-form-item label="熟悉程度" prop="averageCaseRunTi ...

  5. “宇宙最强” IDE,Visual Studio 2019 正式发布

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 本文由葡萄城翻译并发布 今天凌晨Visual Studio 2019已经正式发布,现在已经可以下载了.使用V ...

  6. ASP.NET MVC 5 實作 GridView 分頁

    本文用 ASP.NET MVC 5 實作一個 GridView,功能包括: 分頁(paging).關鍵字過濾(filtering).排序(sorting).AJAX 非同步執行,外觀上亦支援 Resp ...

  7. <%@ Register TagPrefix="uc1" TagName="user" Src="../Control/user.ascx" %>什么意思?

    TagPrefix定义控件位置的命名空间.有了命名空间制约,就可以在同一个网页里使用不同功能的同名控件. TagName指向所使用控件的名字.在同一个命名空间里的控件名是唯一的.控件名一般都表明控件的 ...

  8. [20190416]查看shared latch gets的变化.txt

    [20190416]查看shared latch gets的变化.txt 1.环境:SYS@book> @ ver1PORT_STRING                    VERSION  ...

  9. SimpleDateFormat日期格式化总结

    1.new一个java.util.Date对象,调用它的setYear.setMonth等等方法,设置你要的年月日.不过这种做法不推荐,因为setYear等方法已经过时了.2.new一个java.ut ...

  10. Python入门测试

    1.比如自然数10以下能被3或者5整除的有,3,5,6和9,那么这些数字的和为23. 求能被3或者5整除的1000以内数字的和 multiple_of_threes=[] for multiple_o ...