洛谷P1004 [NOIP 2000 提高组] 方格取数 题目笔记

165 阅读1分钟

这道题目是洛谷上的绿题,但无论是思路还是代码都是没过于复杂。

题目是这样描述的,一个N×N的方格图,这里N≤9,方格中存在一些数字,问从左上角(1,1)出发,走到右下角的(N,N),经过方格可以取走方格的数,此时方格中的数变为0,这样的过程走两次,最大得分是多少。

看到这种路径取数,立马想到可以使用dp尝试一下。

设dp[i][j][k][l]意义为第一次走到点(i,j)第二次走到点(k,l)的最大得分为dp[i][j][k][l]。

由于只能往右和下走,所以就有了四个情况,第一次第二次分别是1、右右,2、右下,3、下右,4、下下。我们考虑转移方程dp[i][j][k][l] = max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]) + a[i][j] + a[k][l]。

顺序选取从1到n的循环,四个维度就是用四次循环,且dp数组的初始化为0,累计加分。

但当第一次和第二次走到了同一位置,这个数只能去一次,所以再把多余的减去,即当i==j&&k==l, dp[i][j][k][l] -= a[i][j]。

最后输出dp[n][n][n][n],即第一次和第二次走到右下角的位置的最大得分。