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

题面

传送门:https://www.luogu.org/problemnew/show/P1006


Solution

挺显然但需要一定理解的网络(应该是那么叫吧)DP

首先有一个显然但重要的结论要发现:从左上走到右下再从右下走回左上=从左上走两次到右下

那么接下来可以考虑:

设f[i][j][k][l]为第一次走到了(i,j)第二次走到了(k,l) 在路径不交错为前提下的能取到的最大友好值

转移方程也挺好写的

考虑这种情况能从哪里转移过来就好(i,j)可以从(i-1,j)或(i,j-1)转移过来,(k,l)可以从(k-1,l)或(k-1,l-1)转移过来

排列组合一下,总共4种可能性,取个最大值再加上a[i][j]和a[k][l]就好

当然(i==k and j==l) 即两个点重合的情况直接continue,因为f 的意义是之前的不重合,当前的也不能重合

预处理整个f设为0就好

时间复杂度O(n^4) n=50,显然能过

接下来我们可以考虑一个优化

因为我们两次从左上到右下是一起走的

就有这么一个推论: i+j = k+l (画个图就好,挺好发现的)

既然这两个相等,也就意味着我们可以通过总和与i,k推算出j,l

然后我们的方程就可以优化成这样的:

f[i][j][k]的意思为:走了i步,第一次走到了第j行,第二次走到了第k行

它们的橫坐标分别为:i-j+2,i-k+2

转移同理

这样,时间复杂度就可以优化为O(n^3),相较之前的可以称为巨大的飞跃

然后就OjbK了


Code

//Luogu P1006 传纸条
//May,4th,2018
//网格DP
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long read()
{
    long long x=0,f=1; char c=getchar();
    while(!isdigit(c)){if(c==‘-‘) f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
const int N=50+5;
int f[2*N][N][N],a[N][N],n,m;
int main()
{
    m=read(),n=read();
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            a[i][j]=read();

    int MAX=n+m;
    for(int i=1;i<=MAX;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=m;k++)
            {
                int X1=i-j+2,Y1=j,X2=i-k+2,Y2=k;
                if((X1==X2 and Y1==Y2)==false and X1>0 and X2>0 and X1<=n and X2<=n)
                {
                    f[i][j][k]=max(f[i][j][k],f[i-1][j][k]);
                    f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k]);
                    f[i][j][k]=max(f[i][j][k],f[i-1][j][k-1]);
                    f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k-1]);
                    f[i][j][k]+=a[j][X1]+a[k][X2];
                }
            }

    printf("%d",max(f[m+n-3][m][m-1],f[m+n-3][m-1][m]));
    return 0;
}

C++(正解)


后记

当时想为什么不会交叉的时候考虑了挺久的,这种类型的网格DP还是得多学习一个,我啊,太naive了

我太弱了

原文地址:https://www.cnblogs.com/GoldenPotato/p/8989311.html

时间: 2024-11-05 14:59:16

[Luogu P1006]传纸条 (网格DP)的相关文章

洛谷 P1006 传纸条

P1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递. 在活动进行中,小渊希望给小轩传递一张纸条,同时希望

P1006 传纸条

P1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递. 在活动进行中,小渊希望给小轩传递一张纸条,同时希望

【洛谷】【动态规划(多维)】P1006 传纸条

[题目描述:] 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递. 在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复.

P1006 传纸条 (方格取数dp)

题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1(1,1),小轩坐在矩阵的右下角,坐标(m,n)(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递. 在活动进行中,小渊希望给小轩传递一张纸条,同时希

洛谷 P1006 传纸条 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1006 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m

Luogu 1006 传纸条

多维动态规划里面的题orz 简化问题为从一个方向传两张纸条 所以用四维数组. 状态转移方程: \(f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i][j-1][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k][l-1])+map[i][j]+map[k][l]\) #include<iostream> #include<cstdio> using namespace std; int m,n,x,y,val,f[51][51

[Luogu P4147] 玉蟾宫 (网格DP)

题面 传送门:https://www.luogu.org/problemnew/show/P4147 Solution 裸的求极大子矩阵 感谢wzj dalao的教学 首先,有一个很显然但很重要的结论,那就是求极大子矩阵肯定要贴着边或一个障碍点,否则就会浪费 根据这个定理,我们可以考虑一种做法 我们可以枚举每一个可放置的点 我们可以很轻松的得知它与它左边的障碍点(或边界)的距离,也可以得知它上面与下面能扩展到哪里(即无障碍点最多能到哪里) 那这个点能扩出的长方形的最大面积就是它左边的上面与下面能

noip2008 传纸条

P1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递. 在活动进行中,小渊希望给小轩传递一张纸条,同时希望

【日常学习】【棋盘DP】【多线程DP】codevs1169 传纸条题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看 这是经典的老题了 来源是08年NOIP提高组 上题目 题目描述 Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵