P1436 棋盘分割[dp]
题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的平方和最小。 请编程对给出的棋盘及n,求出平方和的最小值。 解析 \(dp[k][i][j][x][y]\) 表示当前在切第k刀,当前切 \((i,j)\) 为左上角, \((x,y)\) 为右下角的矩形的最小平方和。 考虑状态转移,一个状态转移到下一个时,它可以继续往两个部分切下去,也就是往两个方向转移。 采用前缀和优化,其中 \(calc(i,j,x,y)\) 表示以 \((i,j)\) 为左上角, \((x,y)\) 为右下角的矩形的和的平方。 \[ dp[k][i][j][x][y]=min(dp[k][i][j][x][y],dp[k-1][i'+1][j][x][y]+calc(i,j,i',y), \\dp[k-1][i][j][x'][y]+calc(x'+1,j,x,y)) \] \[ dp[k][i][j][x][y]=min(dp[k][i][j][x][y],dp[k-1][i][j'+1][x][y