那个均方差,可以通过展开、合并Σ,发现最终只有Xi^2会对答案造成影响,其他都是定值,所以求出最小的和的平方就行。

其实这才是这题最难的部分,以下都是码农部分。

f[x1][y1][x2][y2][k] 从(x1,y1)到(x2,y2)这个矩形,割k次的最小平方和。

边界 k==1时,就是矩形本身面积的平方和。

其余情况,分两种,横着割和竖着割,一块继续割,另一块的面积平方加入答案。

(强烈建议纸笔画图标出坐标,不用纠结下标+1/-1问题)

维数比较多,所以用了记忆化,好写一点。

洛谷AC代码

//Stay foolish,stay hungry,stay young,stay simple
#include<iostream>
using namespace std; int n; int a[9][9],s[9][9];
int f[9][9][9][9][16]; inline int S(int x1,int y1,int x2,int y2){
x1--;y1--;//it includes (x1,y1) ,so..
return s[x2][y2]-s[x2][y1]-s[x1][y2]+s[x1][y1];
} int slove(int x1,int y1,int x2,int y2,int k){
int &ans=f[x1][y1][x2][y2][k];
if(k==1) return S(x1,y1,x2,y2)*S(x1,y1,x2,y2);//actually there is no need to calc it twice
if(ans) return ans;
ans=1<<30;//big enough!
if(x1<x2)
for(int i=x1;i<x2;i++){ int t1=slove(x1,y1,i,y2,k-1);
int s1=S(i+1,y1,x2,y2);
int t2=slove(i+1,y1,x2,y2,k-1);
int s2=S(x1,y1,i,y2);
ans=min(ans,min(t1+s1*s1,t2+s2*s2));
}
if(y1<y2)//maybe useful?
for(int i=y1;i<y2;i++){
int t1=slove(x1,y1,x2,i,k-1);
int s1=S(x1,i+1,x2,y2);
int t2=slove(x1,i+1,x2,y2,k-1);
int s2=S(x1,y1,x2,i);
ans=min(ans,min(t1+s1*s1,t2+s2*s2));
}
return ans;
} int main(){
cin>>n;
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
cin>>a[i][j];
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
cout<<slove(1,1,8,8,n);
return 0;
}

[POJ] 1191 [LUOGU] P1436 棋盘分割的更多相关文章

  1. POJ 1191 DP+DFS棋盘分割问题

    题目大意: Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形 ...

  2. Luogu P1436 棋盘分割 暴力DP

    我的天,,,,,n=8,k<=15,,,这怕不是暴力DP+高维数组.... 开一个五维数组f[k][i][j][p][q]表示从(i,j)到(p,q)中分成k个矩形最小的平方和. 然后初始化时用 ...

  3. 洛谷 P1436 棋盘分割 解题报告

    P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...

  4. 【Luogu】P1436 棋盘分割 题解

    嗯,点开题目,哇!是一道闪亮亮的蓝题! 不要被吓到了,其实,这道题就是一个简单的DP啦! 我们设 \(f[x1][y1][x2][y2][c]\) 为以 \((x1,y1)\) 为左上角,以 \((x ...

  5. P1436 棋盘分割[dp]

    题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次 ...

  6. 洛谷P1436 棋盘分割

    洛谷题目链接 动态规划: 我们设状态$f[i][j][o][p][k]$表示一个矩形,左上角顶点坐标为$(i,j)$,右下角顶点坐标为$(o,p)$时分割了$k$次,也就是说现在是$k+1$块 我们考 ...

  7. HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索

    题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析:  枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...

  8. POJ 1191 棋盘分割 【DFS记忆化搜索经典】

    题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  9. poj 1191 棋盘分割 动态规划

    棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11457   Accepted: 4032 Description ...

随机推荐

  1. 死磕了一题模拟 A掉的时候我是爽的

    ZOJ 3490 没有题解. 一句话,要么贴代码,要么自己打. #include<cstdio> #include<iostream> #include<vector&g ...

  2. python 之 random 模块、 shutil 模块、shelve模块、 xml模块

    6.12 random 模块 print(random.random()) (0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) [1,3] 大 ...

  3. Luogu P3946 ことりのおやつ(小鸟的点心) 【最短路】By cellur925

    题目传送门 日本的冬天经常下雪.不幸的是,今天也是这样,每秒钟雪的厚度会增加q毫米. 秋叶原共有n个地点,编号从1到n.每个地点在开始的时候的积雪高度为hi. 有m条双向道路连接这些地点,它们的长度分 ...

  4. Ubuntu 18.04 LTS 安装后 各种问题以及解决方案

    1. root的初始密码,默认是不知道的,需要进行设置 a. 进入终端自己的用户 b. 输入 sudo passwd回车 c. 输入新密码,回车,重复,回车,搞定 d. su 一下,就可以了 2.  ...

  5. Windows API 搭建OpenGL窗口

    步骤: 1.创建windows窗口,得到窗口句柄hwnd 2.获取该窗口的设备环境hDC(当然也可以获取其他的设备环境,但我们一般是在创建的窗口上绘制) 3.创建OpenGL绘制环境RC,这个只能从h ...

  6. 关于使用IQKeyBoardManager键盘还是被遮挡的问题解决方案

    今天在做一个登录界面的时候发现使用了IQKeyBoardManager键盘还是被遮挡,解决方案如下 解决方案一:在所有视图的最外层添加一个UIView作为容器即可,但在有导航栏的情况下导航栏会跟着向上 ...

  7. offsetLeft 与 left的区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. python之请求报文对比(假定最多二维字典)

    两段请求报文,判断不一样的key和value,只判断d2里和d1不同的值,和全部不同的key ok_req={ "version": "9.0.0", &quo ...

  9. PHP函数技巧篇

    可变参数 Php提供3个函数用于检索在函数中所传递的参数. $array = func_get_args(); //返回一个提供给函数的所有参数的数组 $count = func_num_args() ...

  10. luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...