POJ1191 棋盘分割

吐槽:这是一道比我年龄还大的题目。
正文:首先题意就不解释了,那么我们来思考一下这道题的特点。
假如说我在处理的时候把这个矩形切掉一块,那么剩下的部分处理起来是不是还是要以类似的方式再去分割,所以我们用什么,当然是动态规划啊,再考虑下复杂度,棋盘总共(8*8),状态设起来也不会太多,所以动态规划完全可行。
下面我们来看一下题目给的式子,其实就是一个方差的公式,大家初中应该都学过,这里主要是这个公式在这道题用起来太麻烦了,所以我们化简一下。
上面是方差的平方进行的化简在这里插入图片描述

具体过程主要是展开然后相减
在这里插入图片描述
其实这道题的难点就是这个公式的化简,后面dp转移就比较常规了。
我们考虑化简之后的公式,对于整块棋盘来说,平均数是不变的,所以只需要考虑 x i 2 x_i^2 xi2,让这个数最小,就能保证最后算出来的方差值最小。
目的有了,我们考虑一下dp状态如何设计,这里给出一种比较简单的设法
f[k][x1][y1][x2][y2],表示左上角坐标(x1,y1)到右下角坐标(x2,y2)区域的棋盘经过k次分割后,各块分值平方和的最小值
具体的转移方法大概就是考虑横着或竖着切,转移从k-1转移到k就行了,具体的转移方程看代码吧

#include<bits/stdc++.h>
using namespace std;
int n;
int a[10][10],sum[10][10];
double f[20][10][10][10][10];
double count(int x,int y,int kk,int qq)
{
   
	double num=(double)(sum[kk][qq]+sum[x-1][y-1]-sum[x-1][qq]-sum[kk
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值