poj 1191

来源:互联网 发布:网页禁止注入js脚本 编辑:程序博客网 时间:2024/06/05 04:24

继续黑书上的DP题~

难得的一道中文题啊...

这里题意就不说啦

最后题目理解外加公式转化,就变成了:求8*8的矩形进行n次分割后每一块的平方和的最小值。

 

看黑书上的讲解,觉得递归就可以解决的。。。

后面码代码的时候发现,这不正好可以直接写成记忆化搜索嘛~

用dp[k][i][j][k][g]  表示分割进行到k次时,矩形的左上角的坐标为(i,j)到右下角的坐标为(k,g)时的最小值

所以每次都对矩形的长和宽进行枚举:

dp[k][i][j][k][g]=min(dp(k-1,i,j,a,g)+sum[a+1][j][k][g] , dp(k-1,a+1,j,k,g)+sum[i][j][a][g]);  (i<=a<=k)

dp[k][i][j][k][g]=min(dp(k-1,i,j,k,b)+sum[i][b+1][k][g] ,dp(k-1,i,b+1,k,g)+sum[i][j][k][b] ); (j<=b<=g)

这样就可以求出dp[k][i][j][k][g];

每个状态都被dp数组记录下来了,这样在每次的递归调用中,如果这个状态已经被更新过,那么就不需要继续向下求值了,而是直接用dp数组记录的值即可。

原创粉丝点击