棋盘分割
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 16263   Accepted: 5812

Description

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

原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。 
均方差,其中平均值,xi为第i块矩形棋盘的总分。 
请编程对给出的棋盘及n,求出O'的最小值。 

Input

第1行为一个整数n(1 < n < 15)。 
第2行至第9行每行为8个小于100的非负整数,表示棋盘上相应格子的分值。每行相邻两数之间用一个空格分隔。 

Output

仅一个数,为O'(四舍五入精确到小数点后三位)。

Sample Input

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 3

Sample Output

1.633

Source

题意:

一个8*8的棋盘,进行分割。每次将一个矩形分割成两个。一个矩形的值是里面所有格子值之和。现在想切出n个矩形,希望求得最小的均方差。

思路:

我们先把均方差的公式进行化简

平均值是一个定值,因为每个矩形都是格子值之和。于是我们发现结果之和Xi平方有关。Xi平方越小越好。

对于每一个格子,都可以用两个坐标(i, j)和(x,y)表示,他们分别是矩形的左上角和右下角。

一个矩形有两种切割方法,横着切,竖着切,假设在k处切

横着切时,矩形被分成了(i, j)(k, y) 和 (k + 1, j)(x,y)

竖着切时,矩形被分成了(i,j)(x,k) 和(i, k+1)(x,y)

但是这样还没办法进行状态转移,因为矩形的先后顺序不知道。所以我们可以再引入一维变量,表示各自的顺序。

于是在切割i次时,得到两个矩形,其中一个应该是i+1次切割的矩形。可以得到状态转移方程。

因为是i推i+1,所以用记忆化搜索写起来可能方便一点

 //#include <bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<vector>
#include<map>
#include<set> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL; int n;
int board[][], hang[][], dp[][][][][]; /*int getval(int i, int j, int x, int y)
{
int res = 0;
for(int k = i; k <= x; k++){
res += hang[i][y] - hang[i][j - 1];
}
return res * res;
}*/ int getval(int i, int j, int x, int y)
{
int res = ;
for(int a = i; a <= x; a++){
for(int b = j; b <= y; b++){
res += board[a][b];
}
}
return res * res;
} int DP(int k, int i, int j, int x, int y)
{
int ans = ;
if(dp[k][i][j][x][y] >= )return dp[k][i][j][x][y];
if(k == n - ){
return getval(i, j, x, y);
}
dp[k][i][j][x][y] = inf;
for(int tmp = i; tmp < x; tmp++){
ans = min(DP(k + , i, j, tmp, y) + getval(tmp + , j, x, y), DP(k + , tmp + , j, x, y) + getval(i, j, tmp, y));
dp[k][i][j][x][y] = min(ans, dp[k][i][j][x][y]);
}
for(int tmp = j; tmp < y; tmp++){
ans = min(DP(k + , i, j, x, tmp) + getval(i, tmp + , x, y), DP(k + , i, tmp + , x, y) + getval(i, j, x, tmp));
dp[k][i][j][x][y] = min(ans, dp[k][i][j][x][y]);
}
return dp[k][i][j][x][y];
} int main(){ while(scanf("%d", &n) != EOF){
double sum = ;
memset(hang, , sizeof(hang));
for(int i = ; i <= ; i++){
for(int j = ; j <= ; j++){
scanf("%d", &board[i][j]);
sum += board[i][j] * 1.0;
hang[i][j] = hang[i][j - ] + board[i][j];
}
}
sum /= 1.0 * n;
memset(dp, -, sizeof(dp));
int ans = DP(, , , , );
//cout<<ans<<endl;
//cout<<dp[n - 1][1][1][8][8]<<endl;
printf("%.3f\n",sqrt((dp[][][][][])*1.0/n-sum*sum));
}
return ;
}

poj1191 棋盘分割【区间DP】【记忆化搜索】的更多相关文章

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

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

  2. (区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)

    http://poj.org/problem?id=3186   Description FJ has purchased N (1 <= N <= 2000) yummy treats ...

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

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

  4. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  5. uva 10891 区间dp+记忆化搜索

    https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...

  6. poj1191棋盘分割——区间DP

    题目:http://poj.org/problem?id=1191 分析题意,可知每次要沿棋盘中的一条线把一块一分为二,取其中一块继续分割: σ最小经分析可知即为每块的xi和的平方最小: 故用区间DP ...

  7. loj 1031(区间dp+记忆化搜索)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了. ...

  8. BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】

    题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...

  9. hdu 4597 Play Game(区间dp,记忆化搜索)

    Problem Description Alice and Bob are playing a game. There are two piles of cards. There are N card ...

  10. poj 1088 滑雪(区间dp+记忆化搜索)

    题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...

随机推荐

  1. oop-Inheritance & Polymorphism

    本文主要作为java学习笔记,方便以后查看,大部分内容都源于以下网站: http://www.ntu.edu.sg/home/ehchua/programming/index.html#Game 本文 ...

  2. Java获取网络IP

    Java获取获取网络IP,浅尝辄止咯- import java.net.InetAddress; import java.net.UnknownHostException; /** * 获取网络IP ...

  3. 初涉RxAndroid结合Glide实现多图片载入操作

    转载请注明出处:王亟亟的大牛之路 本来周末就想发了然后各种拖拉就没有然后了,那么就今天早上写吧,废话不多開始正题 什么是RxJava或者RxAndroid我就不多废话了,理论知识一大堆人给我们做好了. ...

  4. IFrame实现的无刷新(仿ajax效果)...

    前台代码: <iframe style="display:none;" name="gg"></iframe> <form act ...

  5. AI逻辑实现-取舍行为树还是状态机

    AI逻辑实现-选择行为树还是状态机? 关注AI的朋友可能会看过赖勇浩翻译的<有限状态机时代终结的10大理由> ,里面谈到了状态机的诸多弊端.同时在ppt(附上下载地址)中述说了行为树的诸多 ...

  6. Buff系统的实现

    BUFF是很多游戏都在采用的一种临时增益机制.本文讲述如何在基于关系型数据库的网页游戏中实现这一系统:如何扩展该系统:以及如何提高该系统的性能. 引言 BUFF是很多游戏都在采用的一种临时增益机制:与 ...

  7. 移动HTML 5前端性能优化指南

    概述 PC优化手段在Mobile侧同样适用 在Mobile侧我们提出三秒种渲染完成首屏指标 基于第二点,首屏加载3秒完成或使用Loading 基于联通3G网络平均338KB/s(2.71Mb/s),所 ...

  8. 阿里巴巴Java开发规约插件-体验

    插件有哪些功能? 阿里技术公众号于今年的2月9日首次公布<阿里巴巴Java开发规约>,瞬间引起全民代码规范的热潮,上月底又发布了PDF的终极版,大家踊跃留言,期待配套的静态扫描工具开放出来 ...

  9. DUBBO功能使用说明

    DUBBO功能使用说明 1 DUBBO概述 DUBBO是阿里巴巴公司的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 相比于其他服务框架,DUBBO有如 ...

  10. mybatis由浅入深day02_8spring和mybatis整合

    8 spring和mybatis整合 8.1 整合思路 需要spring通过单例方式管理SqlSessionFactory.mapper接口. spring和mybatis整合生成代理对象,使用Sql ...