题目描述

将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了n-1次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。 (每次切割都只能沿着棋盘格子的边进行)

原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。求出均方差的最小值。
其中,均方差的定义为:

(里面的括号应该还有一个平方,不然固输0岂不美哉)

数据范围

1<n<15,所有数均为不大于100的非负整数

解析

分析题面可以发现一些结论:
1.只要大矩阵与n确定,平均值就是可以算出的定值
2.每次分完后只能对其中的一部分继续切割
对于第2条举个例子:n=4时,田字型的切割就是不合法的,这对于本题至关重要
我们可以先算出均方差根号里面那个西格玛加和的总值的最小值,最后再除n开根号
定义dp[x1][y1][x2][y2][k]:左上角为x1,y1,右下角为x2,y2还可以切k刀时,切成的k+1部分西格玛方差的最小值
显然,k=0时:

if(k==0) return abs((double)he(x1,y1,x2,y2)-ave)*abs((double)he(x1,y1,x2,y2)-ave);

ave为提前可算好的平均值,he函数可以用二维前缀和O(1)求出,具体见代码(其实遍历求本题时间可能也爆不了。。。 )
对于转移,我们枚举切出去的那个不能再切的矩形的位置即可

代码

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <string>
#include <queue>
#include <string>
#include<map>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a));
#define ull unsigned ll
using namespace std;
const int N=15;
int m,n,tot;
int mp[10][10],sum[10][10];
double ave;
double dp[N][N][N][N][N];
int he(int x1,int y1,int x2,int y2){return sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1];
}
double find(int x1,int y1,int x2,int y2,int k){if(dp[x1][y1][x2][y2][k]) return dp[x1][y1][x2][y2][k];if(k==0) return abs((double)he(x1,y1,x2,y2)-ave)*abs((double)he(x1,y1,x2,y2)-ave);dp[x1][y1][x2][y2][k]=1e9;for(int i=x1;i<x2;i++){//横着切 dp[x1][y1][x2][y2][k]=min(dp[x1][y1][x2][y2][k],find(x1,y1,i,y2,0)+find(i+1,y1,x2,y2,k-1));dp[x1][y1][x2][y2][k]=min(dp[x1][y1][x2][y2][k],find(x1,y1,i,y2,k-1)+find(i+1,y1,x2,y2,0));//注意这里还要反着枚举一遍,因为不能切的部分可能在下边 }for(int j=y1;j<y2;j++){//竖着切 dp[x1][y1][x2][y2][k]=min(dp[x1][y1][x2][y2][k],find(x1,y1,x2,j,0)+find(x1,j+1,x2,y2,k-1));dp[x1][y1][x2][y2][k]=min(dp[x1][y1][x2][y2][k],find(x1,y1,x2,j,k-1)+find(x1,j+1,x2,y2,0));}return dp[x1][y1][x2][y2][k];
}
int main(){scanf("%d",&n);for(int i=1;i<=8;i++){for(int j=1;j<=8;j++) scanf("%d",&mp[i][j]);}for(int i=1;i<=8;i++){for(int j=1;j<=8;j++) sum[i][j]=sum[i][j-1]+mp[i][j];}for(int j=1;j<=8;j++){for(int i=1;i<=8;i++) sum[i][j]+=sum[i-1][j];}ave=1.0*sum[8][8]/n;printf("%.3lf",sqrt(1.0*find(1,1,8,8,n-1)/n));
}
/*
样例:
3
1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0
1 1 1 1 1 1 0 3ans:1.633
*/

心得

一次AC万岁!!!!

这道dp做的还是不错的,尤其是很快发现了解析中提到的两条关键结论,从而带出了思路
所以要仔细审题!!
dp就像数学平几,有时候思路一下子通了就不难了awa

thanks for reading!

不止代码:ybtoj-棋盘分割(二维区间dp)相关推荐

  1. ZROI 2021 10联day8 T1 题(期望+二维区间DP)

    你要在一片菜地里捉兔子. 菜地形如一个一个 N×M 的长方形网格,每个顶点要么是空的,要么有一个兔子洞.在每个洞里有恰好 44 只兔子.在土地的四个角都设置了逮兔陷阱(陷阱在坐标 [0,0],[0,M ...

  2. 不止代码:ybtoj-消除木块(区间DP)

    题目描述 n个木块排成一列,每个木块都有一个颜色. 每次,你都可以点击一个木块,这样被点击的木块以及和它相邻并且同色的木块就会消除. 如果一次性消除了k个木块,那么就会得到k*k分. 给定你一个游戏初 ...

  3. 不止代码:乘法游戏 题解(区间dp)

    题目描述 乘法游戏是在一行牌上进行的.每一张牌包括了一个正整数.在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌.最后一次移动后,这里只剩下两张牌. ...

  4. [二维区间DP?] Atcoder ARC004E. Salvage Robots

    可以让出口移动,robots不动 fu,d,l,r f_{u,d,l,r} 表示出口活动的区域为 (x−u,y−l) (x-u,y-l) 到 (x+d,y+r) (x+d,y+r) 这个矩形时最多能救 ...

  5. The UVALIVE 7716 二维区间第k小

    The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素n <= 250 ...

  6. 用11行Python代码,实现动态二维码制作

    用11行Python代码,实现动态二维码制作 效果展示 Python实现 素材 其他工具 效果展示 Python实现 要预装myqr模块才行. windows键+R 打开cmd,输入pip insta ...

  7. 2021-03-22-TensorFlow故障诊断代码-一维信号转二维灰度图

    故障诊断代码-一维信号转二维灰度图 凯斯西储大学数据划分及灰度图转换 故障诊断代码 凯斯西储大学数据划分及灰度图转换 https://mp.weixin.qq.com/s?__biz=MzkxMzE5 ...

  8. php二维数组倒序,几行代码搞定PHP二维数组排序

    排序是数据统计非常重要的环节,简单几行代码轻松搞定二维数组的排序 $data[] = array('volume' => 67, 'edition' => 2); $data[] = ar ...

  9. python生成二维码代码_python 一行代码生成 二维码

    效果图如上:动态二维码,彩色二维码,黑白二维码: 看到别人做的炫酷二维码,瞬间心动,想动手做个 自己的炫酷二维码. github上有大神 做的框架,直接拿来用,安装工具 myqr: pip insta ...

最新文章

  1. 基于OpenCV的单目摄像机测距
  2. SET_TABLE_FOR_FIRST_DISPLAY 参数 I_SAVE
  3. java 减法 位运算,位运算-实现加减乘除
  4. Mint-UI 移动首页开发 - header导航、banner轮播图
  5. 远程登录阿里云上的MySQL
  6. 【华为云技术分享】Sketch插件技术 — 让研发和设计高效协同
  7. element-ui 源码学习
  8. 嵌套查询和连接查询的效率_LeetCode 查找:groupby+having/嵌套查询/连接
  9. java springboot房地产信息管理系统
  10. 【python】函数和模块
  11. 怎样进入金蝶服务器修改参数,金蝶KIS专业版的系统参数在哪里设置
  12. 好未来表格识别大赛 | 获奖名单新鲜出炉!
  13. C标准库-va_list
  14. C++的学习路线以及未来就业趋势
  15. 赛马c语言编程,C/C++编程题之渊子赛马
  16. 学习云计算有什么用处 该怎么学好云计算技术
  17. C++ 在控件上使用科学记数法输出数据
  18. python朴素贝叶斯对wine_基于朴素贝叶斯对Wine数据集分类
  19. STM32主从模式 精确脉冲数PWM (已实现)
  20. 淘宝开店怎么做运营?

热门文章

  1. java语言程序设计第六章答案_Java语言程序设计(邵丽萍编著)第六章.doc
  2. php 无限查找下级业绩_PHP 面试踩过的坑
  3. arm cpu 超频_树莓派 400 超频方法介绍
  4. linux系统故障实验,Linux常见系统故障排除
  5. docker es持久化_使用docker数据卷对容器数据持久化
  6. 计算机模拟分子设计,计算机模拟分子材料.pdf
  7. python2中的unicode_在python 3和2中工作的Unicode文字
  8. java xml 追加,java – 如何将节点从xml文档追加到现有的xml文档
  9. php 动态设置utf8,PHP对GB编码动态转UTF-8几种方法评测
  10. 高等数学上-赵立军-北京大学出版社-题解-练习4.5