zoukankan      html  css  js  c++  java
  • P1006 传纸条 /// DP+滚动数组

    题目大意:

    https://www.luogu.org/problemnew/show/P1006

    题解

    不难想到 求从起点到终点的两条不同的路

    因为只能向右或向下走 所以纸条1和2不可能同时位于同一行

    dp[ i ][ j ][ k ]为 第 i 步时1位于 j 行2位于 k 行(这里为1~n行1~m列)

    当知道步数 i 和所在行数 j 时,列数就为 i - j + 1

    若同时位于同一行 即 j==k

    再次走到同一个位置

    则2到该位置时好感已被消耗

    if( j==k ) dp[ p ][ j ][ k ] += a[ j ][ i-j+1 ];  所以此处只加一个

    else dp[ p ][ j ][ k ] += a[ j ][ i-j+1 ]+a[ k ][ i-k+1 ];

    这种状态必然会比其他状态 好感值低

    则求max()时 自然会将这种情况筛选掉

    #include <bits/stdc++.h>
    using namespace std;
    /// dp[i][j][k] 当走到第i步 纸条1位于j行 2位于k行[j][k] 时的最大好感值
    /// 则可以从第i-1步时为 [j][k] [j][k-1] [j-1][k] [j-1][k-1] 四种情况转移而来
    int main()
    {
        int n,m,dp[2][55][55],a[55][55];
        while(~scanf("%d%d",&n,&m)) {
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    scanf("%d",&a[i][j]);
            memset(dp,0,sizeof(dp));
            dp[1][1][1]=a[1][1];
            for(int i=2;i<n+m;i++)
                for(int j=1;j<=n && j<=i;j++)
                    for(int k=1;k<=n && k<=i;k++) {
                        int p=i%2;
                        dp[p][j][k]=max(max(dp[!p][j][k],dp[!p][j-1][k]),
                                        max(dp[!p][j][k-1],dp[!p][j-1][k-1]));
                        if(j==k) dp[p][j][k]+=a[j][i-j+1];  // j==k说明同步在同一个位置 
                        else dp[p][j][k]+=a[j][i-j+1]+a[k][i-k+1];
                    }
            printf("%d
    ",dp[(n+m-1)%2][n][n]);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    Django系列:TemplateView,ListView,DetailView
    Django系列:开发自己的RestAPI
    Django系列:Restful CBV
    Django系列:RestFul
    Django系列12:Django模型关系
    B
    All about that base
    Safe Passage
    A
    Isomorphic Inversion
  • 原文地址:https://www.cnblogs.com/zquzjx/p/9327201.html
Copyright © 2011-2022 走看看