棋盘分割(二维区间DP)
题目大意:给一个棋盘,棋盘上每个格子中都有一个值,现在需要将棋盘切成n个矩形,总共切n-1刀,求最小的均方差。均方差定义为:,其中
。
题目分析:将均方差化简得到:均方差2=(Σxi2)/n-平均值2。显然,平均值2是定值,为数字总和除以n。只需让矩形的和的平方和最小即可。先预处理出数组s(x1,y1,x2,y2),表示左上角为(x1,y1),右下角为(x2,y2)的矩形上数字和的平方,定义dp(k,x1,y1,x2,y2)表示将矩形(x1,y1,x2,y2)切k刀能获得k+1个矩形时各矩形上数字和的最小平方和。则状态转移方程为:dp(k,x1,y1,x2,y2)=min{ min(dp(k-1,x1,y1,i,y2)+s(i+1,y1,x2,y2)),min(dp(k-1,i+1,y1,x2,y2)+s(x1,y1,i,y2))), x1≤i<x2 (横着切)
min(dp(k-1,x1,y1,x2,j)+s(x1,j+1,x2,y2)),min(dp(k-1,x1,j+1,x2,y2)+s(x1,y1,x2,j))), y1≤j<y2 (竖着切)
}
代码如下:
- # include<iostream>
- # include<cstring>
- # include<cstdio>
- # include<cmath>
- # include<algorithm>
- using namespace std;
- const int INF=1<<30;
- int w[8][8],n;
- int dp[16][8][8][8][8],s[8][8][8][8];
- int getS(int a,int b,int c,int d)
- {
- int sum=0;
- for(int i=a;i<=c;++i)
- for(int j=b;j<=d;++j)
- sum+=w[i][j];
- return sum*sum;
- }
- void work(int x,int y)
- {
- for(int i=x;i<8;++i)
- for(int j=y;j<8;++j)
- s[x][y][i][j]=getS(x,y,i,j);
- }
- void init()
- {
- for(int i=0;i<8;++i)
- for(int j=0;j<8;++j)
- work(i,j);
- }
- void ceShi()
- {
- for(int i=0;i<8;++i)
- for(int j=0;j<8;++j)
- for(int k=i;k<8;++k)
- for(int l=j;l<8;++l)
- cout<<i<<' '<<j<<' '<<k<<' '<<l<<' '<<s[i][j][k][l]<<endl;
- }
- int dfs(int k,int xa,int ya,int xb,int yb)
- {
- if(dp[k][xa][ya][xb][yb]>=0) return dp[k][xa][ya][xb][yb];
- int &u=dp[k][xa][ya][xb][yb];
- if(k==0) return u=s[xa][ya][xb][yb];
- if(xa==xb&&ya==yb) return u=s[xa][ya][xb][yb];
- u=INF;
- for(int i=xa;i<xb;++i){
- u=min(dfs(k-1,xa,ya,i,yb)+s[i+1][ya][xb][yb],u);
- u=min(dfs(k-1,i+1,ya,xb,yb)+s[xa][ya][i][yb],u);
- }
- for(int i=ya;i<yb;++i){
- u=min(dfs(k-1,xa,ya,xb,i)+s[xa][i+1][xb][yb],u);
- u=min(dfs(k-1,xa,i+1,xb,yb)+s[xa][ya][xb][i],u);
- }
- return u;
- }
- int main()
- {
- while(~scanf("%d",&n))
- {
- double sum=0.0;
- for(int i=0;i<8;++i)
- for(int j=0;j<8;++j){
- scanf("%d",&w[i][j]);
- sum+=(double)w[i][j];
- }
- sum/=(double)n;
- memset(s,0,sizeof(s));
- init();
- //ceShi();
- memset(dp,-1,sizeof(dp));
- dfs(n-1,0,0,7,7);
- double ans=(double)dp[n-1][0][0][7][7]/(double)n-sum*sum;
- printf("%.3lf\n",sqrt(ans));
- }
- return 0;
- }
棋盘分割(二维区间DP)的更多相关文章
- The UVALIVE 7716 二维区间第k小
The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询 每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素 n <= 2 ...
- POJ - 1191 棋盘分割 记忆递归 搜索dp+数学
http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...
- [NOI1999] 棋盘分割(推式子+dp)
http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 156 ...
- 字符串分割+二维数组 Day15练习
package com.sxt.arrays.test; import java.util.Arrays; /* 1,2,3,4!5,6,7!8,9!12,456,90!32 * 将此字符串以叹号为分 ...
- BZOJ2877 NOI2012魔幻棋盘(二维线段树)
显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...
- NYOJ15|括号匹配(二)|区间DP|Elena
括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[&qu ...
- Vijos1392拼拼图的小衫[背包DP|二维信息DP]
背景 小杉的幻想来到了经典日剧<死亡拼图>的场景里……被歹徒威胁,他正在寻找拼图(-.-干嘛幻想这么郁闷的场景……). 突然广播又响了起来,歹徒竟然又有了新的指示. 小杉身为新一代的汤浅, ...
- UVA1347 旅游(二维递归DP)
旅游 [题目链接]旅游 [题目类型]DP &题解: 紫书P269 代码很简单,但思路很难.很难能想到要把一个圈分成2条线段,很难想到d(i,j)表示的是已经走过max(i,j)还需要的距离值, ...
- NYOJ737石子合并(二)-(区间dp)
题目描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出 ...
随机推荐
- Prometheus 操作符
操作符 二元操作符 Prometheus的查询语言支持基本的逻辑运算和算术运算.对于两个瞬时向量, 匹配行为可以被改变. 算术二元运算符 在Prometheus系统中支持下面的二元算术操作符: + 加 ...
- Linux救援模式
Linux系统使用版本:CentOS 6.5 救援模式有什么作用: ◆可以更改root密码: ◆恢复硬盘.文件系统操作: ◆系统启动不来的时候,只能通过救援模式来启动: 救援模式启动的步骤如下: 1. ...
- talib 中文文档(三):talib 方法大全
Function API Examples Similar to TA-Lib, the function interface provides a lightweight wrapper of th ...
- python网络编程知识体系
python的网络编程包括: 1.mvc-socket-线程-进程-并发-IO异步-消费者生产者 2.mysql-paramiko-审计堡垒机-redis-分布式监控 线程.进程 和 协程 原理剖析 ...
- 解决Eclipse中新建jsp文件总是以ISO8859-1编码问题
eclipse --> window -->Preferences-->web-->jsp-->utf-8
- (2.10)Mysql之SQL基础——约束及主键重复处理
(2.10)Mysql之SQL基础——约束及主键重复处理 关键词:mysql约束,批量插入数据主键冲突 [1]查看索引: show index from table_name; [2]查看有约束的列: ...
- SLAM FOR DUMMIES 第5-8章 中文翻译
5,SLAM的处理过程 SLAM过程包括许多步骤,该过程的目标是使用环境更新机器人的位置.由于机器人的里程计通常是存在误差的,我们不能直接依赖于里程计.我们可以用激光扫描环境来校正机器人的位置,这是通 ...
- idea中添加模板。
1:点击File>settings>live template 2: 在 Editor界面下,点击右上角 + 好, 如果想添加一个新类型的语言,点击templateGroup 输入组名. ...
- (转)《SSO CAS单点系列》之 实现一个SSO认证服务器是这样的!
上篇我们引入了SSO这个话题<15分钟了解SSO是个什么鬼!>.本篇我们一步步深入分析SSO实现机理,并亲自动手实现一个线上可用的SSO认证服务器!首先,我们来分析下单Web应用系统登录登 ...
- (转)SpringBoot非官方教程 | 第十二篇:springboot集成apidoc
首先声明下,apidoc是基于注释来生成文档的,它不基于任何框架,而且支持大多数编程语言,为了springboot系列的完整性,所以标了个题. 一.apidoc简介 apidoc通过在你代码的注释来生 ...