这道题目是洛谷上的绿题,但无论是思路还是代码都是没过于复杂。
题目是这样描述的,一个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],即第一次和第二次走到右下角的位置的最大得分。