[POJ] 1191 [LUOGU] P1436 棋盘分割
那个均方差,可以通过展开、合并Σ,发现最终只有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 棋盘分割的更多相关文章
- POJ 1191 DP+DFS棋盘分割问题
题目大意: Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形 ...
- Luogu P1436 棋盘分割 暴力DP
我的天,,,,,n=8,k<=15,,,这怕不是暴力DP+高维数组.... 开一个五维数组f[k][i][j][p][q]表示从(i,j)到(p,q)中分成k个矩形最小的平方和. 然后初始化时用 ...
- 洛谷 P1436 棋盘分割 解题报告
P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...
- 【Luogu】P1436 棋盘分割 题解
嗯,点开题目,哇!是一道闪亮亮的蓝题! 不要被吓到了,其实,这道题就是一个简单的DP啦! 我们设 \(f[x1][y1][x2][y2][c]\) 为以 \((x1,y1)\) 为左上角,以 \((x ...
- P1436 棋盘分割[dp]
题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次 ...
- 洛谷P1436 棋盘分割
洛谷题目链接 动态规划: 我们设状态$f[i][j][o][p][k]$表示一个矩形,左上角顶点坐标为$(i,j)$,右下角顶点坐标为$(o,p)$时分割了$k$次,也就是说现在是$k+1$块 我们考 ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- poj 1191 棋盘分割 动态规划
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11457 Accepted: 4032 Description ...
随机推荐
- CodeForces 13A【暴力】
题意: 给你的一个十进制数n,计算对于2~n-1进制下的每个位相加和与数n-2的比值. 思路: n是1000,所以直接暴力一发? #include<cstdio> #include< ...
- hdoj5813【构造】
2016 Multi-University Training Contest 7 05 真的真的好菜哇... 思路: 暴力. 我对那些到达目的地少的点做硬性规定就是去比他要到达目的地更少的点,这样一来 ...
- Unity插值函数Lerp()与增量时间Time.deltatime
一.Unity插值函数Lerp() 通过官方文档简单了解插值函数(https://docs.unity3d.com/ScriptReference/index.html),可以看到插值函数有很多 Ma ...
- 布线问题 最小生成树 prim + kruskal
1 : 第一种 prime 首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 s ...
- 【Ajax】接收后台数据在html页面显示
Java代码 PrintWriter out=response.getWriter(); //向客户端发送字符数据 response.setContentType("text/text&qu ...
- 从输入url到浏览器显示页面的过程
总体来说有两个大的方面: 一.网络通信连接部分.二.页面渲染展示部分. 细分详细过程: (网络通信) 1.输入url. 2.DNS解析域名. 3.拿到IP地址后,浏览器向服务器建立tcp连接. 4.浏 ...
- [洛谷P4185] [USACO18JAN]MooTube
题目链接: 传送门 题意: 给定一颗N个节点的树,定义两点距离为他们之间路径中边权最小值. Q次询问K,V,询问到V距离>=K的点有多少(不含V) 呃呃呃呃考试的时候直奔了T3,结果公式推挂了( ...
- angular 2 angular quick start Could not find HammerJS
Angular2 的material中 引用了 hammerjs,遇到Could not find HammerJS错误,正确的步骤如下: 需要在如下位置增加 对material 和 hammerjs ...
- 18.5.1使用Proxy和InvocationHandler创建动态代理
package d18_5_1; public interface Person { void walk(); void sayHello(String name); } package d18_5_ ...
- 微信小程序消息推送,前端操作
<form bindsubmit="getFormId" report-submit="true"> <button form-type=&q ...