DP. 数字三角形模型

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DP. 数字三角形模型相关的知识,希望对你有一定的参考价值。

DP.数字三角形模型

 


1015. 摘花生


终点:

  • 东南角 ( i , j ) (i, j) (i,j)
  • 设东南角最大花生数 dp[i][j]

dp[i][j],从哪里来?

  • 可能一:左边 dp[i-1][j]
  • 可能二:上边 dp[i][j-1]
  • 转移方程: d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] + w [ i ] [ j ] ,   d p [ i ] [ j − 1 ] + w [ i ] [ j ] ) dp[i][j] = max(dp[i-1][j]+w[i][j],~ dp[i][j-1]+w[i][j]) dp[i][j]=max(dp[i1][j]+w[i][j], dp[i][j1]+w[i][j])
  • 最简单的情况: d p [ 0 ] [ 0 ] = 0 dp[0][0]=0 dp[0][0]=0

第 i 层的答案只依赖于第 i 层和第 i - 1 层,可以状态压缩。

  • 转移方程: f [ j ] = m a x ( f [ j ] ,   f [ j − 1 ] ) + w f[j] = max(f[j],~ f[j - 1]) + w f[j]=max(f[j], f[j1])+w
     

1018. 最低通行费

因为从方格左上角走到右下角的距离是:N*N,要在 2N-1 的时间出去,这代表不能走回头路。

在这个限定条件下,整体思路\\代码和摘花生没有区别。
 


1027. 方格取数


一开始的思路就是,俩次 DP 即可。

但是分开走的局部最优,不是全局最优。

从 A 点到 B 点共走了两次,我们可以设两条路径是同时出发的。

因为是俩条路径,我们用俩维数组是存不下的,我们开四维的。

走法还是不能走回头路,俩个方向 * 俩个走法 = 4。

按照题目要求,还需要在刷新值,第一次走过的格子要变成 0。

        for (int a = 1; a < n; a++) 
            for (int b = 1; b < n; b++) 
                for (int c = 1; c < n; c++) 
                    for (int d = 1; d < n; d++) 
                        int x = max(f[a - 1][b][c - 1][d], f[a - 1][b][c][d - 1]);
                        int y = max(f[a][b - 1][c - 1][d], f[a][b - 1][c][d - 1]);
                        int z = g[a][b] + ((a == c && b == d) ? 0 : g[c][d]); // 是否走同一个格子,同一个格子只能走一次,第二次赋值为 0 
                        f[a][b][c][d] = max(x, y) + z;
                    
        return f[n - 1][n - 1][n - 1][n - 1];

 


275. 传纸条

从小渊传到小轩的纸条只可以向下或者向右传递,小轩传给小渊的纸条只可以向上或者向左传递。

可是这并不影响结果,因为任意一个从点 ( m , n ) (m,n) (m,n) 到点 ( 1 , 1 ) (1,1) (1,1) 的路径都可以映射成一个从点 ( 1 , 1 ) (1,1) (1,1) 到点 ( m , n ) (m,n) (m,n) 的路径。

这样就和方格取数相同了。

与方格取数不同的是, 一个方格只能经过一次(每个同学只帮一次)。

以上是关于DP. 数字三角形模型的主要内容,如果未能解决你的问题,请参考以下文章

动态规划数字三角形模型 AcWing 1027. 方格取数 275. 传纸条

动态规划数字三角形模型 AcWing 1027. 方格取数 275. 传纸条

DP 类型题一 (模型:数字三角形+最长上升子序列+背包)

DP 类型题一 (模型:数字三角形+最长上升子序列+背包)

DP 类型题一 (模型:数字三角形+最长上升子序列+背包)

方格取数+ 传纸条 noip2000 + noip2008 DP