题目大意:

Description

将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。 均方差,其中平均值,xi为第i块矩形棋盘的总分。 请编程对给出的棋盘及n,求出O'的最小值。

运用动态规划状态为int d(int k, int x1, int y1, int x2, int y2),表示左上角为(x1, y1),右下角为(x2, y2)的矩阵被切割成n块时可以达到的最小平方和。
状态转移方程

nowstate=min( nowstate, dfs(k-1, x1, y1, a ,y2)+s[a+1, y1, x2, y2])

nowstate=min( nowstate, dfs(k-1, a+1, y1, x2, y2)+s[x1, y1, a, y2])

nowstate=min( nowstate, dfs(k-1, x1, b+1, x2, y2)+s[x1, y1, x2, b])

nowstate=min( nowstate, dfs(k-1, x1, y1, x2, b)+s[x1, b+1, x2, y2])

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int dp[][][][][],val[][],n; int sum(int x1,int y1,int x2,int y2)
{
int ans=val[x2][y2]-val[x1-][y2]-val[x2][y1-]+val[x1-][y1-];
return ans*ans;
} int dfs(int k,int x1,int y1,int x2,int y2)
{
if(dp[k][x1][y1][x2][y2]) return dp[k][x1][y1][x2][y2];
if(k==||x1==x2||y1==y2){
dp[k][x1][y1][x2][y2]= sum(x1,y1,x2,y2);
return dp[k][x1][y1][x2][y2];
}
int nowstate=INF;
for(int i=x1;i<x2;i++){
nowstate=min(nowstate,dfs(k-,i+,y1,x2,y2)+sum(x1,y1,i,y2));
nowstate=min(nowstate,dfs(k-,x1,y1,i,y2)+sum(i+,y1,x2,y2));
}
for(int i=y1;i<y2;i++){
nowstate=min(nowstate,dfs(k-,x1,i+,x2,y2)+sum(x1,y1,x2,i));
nowstate=min(nowstate,dfs(k-,x1,y1,x2,i)+sum(x1,i+,x2,y2));
}
dp[k][x1][y1][x2][y2]=nowstate;
return nowstate;
} void change()
{
for(int i=;i<=;i++)
val[i][]=,val[][i]=; for(int i=;i<=;i++)
for(int j=;j<=;j++)
val[i][j]+=val[i-][j]+val[i][j-]-val[i-][j-];
} int main()
{
while(~scanf("%d",&n)){ memset(dp,,sizeof(dp)); for(int i=;i<=;i++)
for(int j=;j<=;j++)
scanf("%d",&val[i][j]); change(); double res;
double ave=1.0*val[][]/n;
res=sqrt((double)dfs(n,,,,)/n-ave*ave);
printf("%.3f\n", res);
}
return ;
}
 

POJ 1191 DP+DFS棋盘分割问题的更多相关文章

  1. [POJ] 1191 [LUOGU] P1436 棋盘分割

    那个均方差,可以通过展开.合并Σ,发现最终只有Xi^2会对答案造成影响,其他都是定值,所以求出最小的和的平方就行. 其实这才是这题最难的部分,以下都是码农部分. f[x1][y1][x2][y2][k ...

  2. poj 1321 (简单DFS) 棋盘问题

    题目:http://poj.org/problem?id=1321 最近状态有点down, 练练手 #include<cstdio> using namespace std; ][]; ] ...

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

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

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

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

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

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

  6. POJ 1191 棋盘分割

    棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11213 Accepted: 3951 Description 将一个 ...

  7. POJ 1191棋盘分割问题

    棋盘分割问题 题目大意,将一个棋盘分割成k-1个矩形,每个矩形都对应一个权值,让所有的权值最小求分法 很像区间DP,但是也不能说就是 我们只要想好了一个怎么变成两个,剩下的就好了,但是怎么变,就是变化 ...

  8. [NOI1999] 棋盘分割(推式子+dp)

    http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 156 ...

  9. poj1191 棋盘分割【区间DP】【记忆化搜索】

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

随机推荐

  1. 修改SolrCloud在ZooKeeper中的配置文件操作记录

    修改SolrCloud在ZooKeeper中的配置文件操作记录. 命令执行目录: /opt/solr-/server/scripts/cloud-scripts/ 1.下载配置文件 ./zkcli., ...

  2. 安装11g 数据库

    出现问题解决: 1.首先确认下载的安装包完整性.2解压包的时候,按顺序解压,解压第一个包后,解压第二个包的时候,要把解压地址与解压第二包的地址要一样. 安装的时候,需要把两个压缩包都解压,并将目录wi ...

  3. 银联手机支付控件官方使用指南(ios版)

    目录 版本信息... 2 目录      3 1       概述... 1 2       支付流程介绍... 1 3       测试帐号... 2 4       iOS客户端... 3 4.1 ...

  4. GridView 中绑定DropDownList ,下拉框默认选中Label的值

    在GridView中,我们 有时候要绑定值. 前台绑定的代码可以这样 <asp:TemplateField HeaderText="当前状态" ItemStyle-Horiz ...

  5. CCF|路径解析|Java

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in=ne ...

  6. 掌握Spark机器学习库-07-线性回归算法概述

    1)简介 自变量,因变量,线性关系,相关系数,一元线性关系,多元线性关系(平面,超平面) 2)使用线性回归算法的前提 3)应用例子 沸点与气压 浮力与表面积

  7. 最近面试oracle 数据库的知识点

    1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windo ...

  8. A、B、C、D四个字母,能组成多少个互不相同且无重复三位组合

    package 第五天的作业;/* * A.B.C.D四个字母,能组成多少个互不相同且无重复三位组合 */public class Demo14 { public static void main(S ...

  9. js模拟支付宝发送短信验证码&&&&短信倒计时

    html <div class="pwdContent"> <div class="pwdBox"></div> <d ...

  10. 散列的键值对没初始化时不要用print打印此值,不要用 . 操作符去连接打印 这个值。

    31 delete $vertical_alignment{$anonymous};     32 print $vertical_alignment{$anonymous}."\n&quo ...