神秘绑架案

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

冬马被方师傅绑架了!!!

一天,春希收到了一个信封,里面有一张印有8×8棋盘的纸,一个被加了密的U盘和一个便条。便条上写着:


冬马在我手上,如果你想救出冬马,U盘里就有我详细的地址,当然前提是你能解出密码!

你可以把这个棋盘分割成n块,每一次你可以从一棋盘上割下一块矩形,并让剩下的部分也是矩形,再将剩下的部分如此分割。

原棋盘每一格有一个分值,一块矩形的总分为其所含各格分值之和。你需要按上述方法将棋盘分成n块后,求出各矩形棋盘总分的均方差。我也不介意告诉你,所有均方差中的最小值就是U盘的密码,那么请挣扎吧!

平均数公式:

x¯=∑ni=1xin

均方差公式:

σ=∑ni=1(xi−x¯)2n−−−−−−−−−−−−√

------方师傅留


春希非常焦急的找到了你,希望你能找出这个最小值,救出冬马。

Input

第一行一个整数n,表示分割后的块数。(1<n<15)

第二行到第九行,每行八个小于100的非负整数,表示棋盘上相应格子的分值。

Output

一个数,表示求出的最小值。(四舍五入精确到小数点后三位)

Sample input and output

Sample Input Sample Output
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
1.633

Source

2014 UESTC Training for Dynamic Programming
 
解题报告
。。。这题最大的坑点在于题意。。(我悲剧的查了两小时的错,结果发现题读错了。。。)
注意到你切矩形一次,有一边就不能再切了!!!。。。
也就是说你每切一次,就只能选择其中的一边继续切(玩醉了)
记忆化搜索,f(i,j,k) 表示把坐上角序号为i ,右下角序号为j的矩形分成k块的最小(x - x_)^2值..
剩下的搜就是了(水题)
 
 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = ;
int sum[maxn][maxn],n;
double f[][][],average= .;
bool arrive[][][]; inline int getr(int x)
{
return (x-)/ + ;
} inline int getc(int x)
{
return (x-) % + ;
} inline int getid(int x,int y)
{
return (x-)*+y;
} double getval(int left,int right)
{
int sumx = ;
int rst = getr(left) , red = getr(right) , cst = getc(left) , ced = getc(right);
for(int i = rst ; i <= red ; ++ i)
sumx += sum[i][ced] - sum[i][cst-];
return (double)(sumx - average)*(sumx - average);
} double dp(int left,int right,int times)
{
if (arrive[left][right][times])
return f[left][right][times];
double &ans = f[left][right][times] = 1e110;
arrive[left][right][times] = true;
int rst = getr(left) , red = getr(right) , cst = getc(left) , ced = getc(right);
int number = (red - rst + ) * (ced - cst + );
if (times > number)
return ans;
if (times == ) //无法继续切割
return ans = getval(left,right);
//竖着切
for(int i = cst + ; i <= ced ; ++ i)
{
int newleft = getid(rst,i);
int newright = getid(red,i-);
ans = min(ans,getval(left,newright)+dp(newleft,right,times-)); //拿右边继续切
ans = min(ans,getval(newleft,right)+dp(left,newright,times-)); //拿左边继续切
}
//横着切
for(int i = rst ; i < red ; ++ i)
{
for(int j = ; j <= times- ; ++ j)
{
int newleft = getid(i+,cst);
int newright = getid(i,ced);
ans = min(ans,getval(left,newright)+dp(newleft,right,times-)); //拿下面继续切
ans = min(ans,getval(newleft,right)+dp(left,newright,times-)); //拿上面继续切
}
}
return ans;
} int main(int argc,char *argv[])
{
memset(sum,,sizeof(sum));
memset(arrive,false,sizeof(arrive));
scanf("%d",&n);
for(int i = ; i <= ; ++ i)
for(int j = ; j <= ; ++ j)
{
int temp;
scanf("%d",&temp);
sum[i][j] = sum[i][j-] + temp;
average += (double)temp;
}
average /= n;
printf("%.3f\n",sqrt(dp(,,n) / n));
return ;
}

UESTC_神秘绑架案 CDOJ 881的更多相关文章

  1. UESTC 881 神秘绑架案 --二维DP

    LRJ黑书上的例题. 化简均方差公式: 均值的平方一定,所以只需让矩形的总分的平方和最小即可. 定义:dp[k][x1][y1][x2][y2],以(x1,y1)为左上角坐标,(x2,y2)为右下角坐 ...

  2. UESTC_冬马党 CDOJ 882

    冬马党 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Statu ...

  3. 2014 UESTC暑前集训动态规划专题解题报告

    A.爱管闲事 http://www.cnblogs.com/whatbeg/p/3762733.html B.轻音乐同好会 C.温泉旅馆 http://www.cnblogs.com/whatbeg/ ...

  4. java对xml文件的读取

    <?xml version="1.0" encoding="UTF-8"?> <body> <names type="1 ...

  5. [No000056]你无法真正占有一个人,包括你的爱人,先生或太太、小孩,以及你自己....

    从一出生,我们的双手就握的紧紧的,好像深知自己会失去什么 很多人迷信多子多孙才是福,老来才有依靠,但太多新闻告诉我们,很多人老了,子孙为了分家产,反而让他生不如死,死了还无法入土为安. 现实也告诉我们 ...

  6. 【海岛帝国系列赛】No.2 海岛帝国:“落汤鸡”市的黑帮危机

    50200210海岛帝国:“落汤鸡”市的黑帮危机 [试题描述] 近几天,犯罪分子发现“药师傅”帝国的警力约等于0.(请见YSF的海岛帝国)于是开始猖狂了起来.他们选择了依山靠水(农村?)的“落汤鸡”市 ...

  7. UESTC_敢说就敢做 CDOJ 631

    敢说就敢做 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  8. UESTC_方老师的分身 II CDOJ 915

    方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  9. UESTC_方老师分身 I CDOJ 914

    方老师分身 I Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

随机推荐

  1. bzoj3431 [Usaco2014 Jan]Bessie Slows Down

    Description [Brian Dean, 2014] Bessie the cow is competing in a cross-country skiing event at the wi ...

  2. c++ 14

    一.堆栈(stack) stack -> vector/deque/list push  -> push_back pop   -> pop_back top   -> bac ...

  3. 工具:七牛云备份VPS服务器文件

    每一天,服务器上都会产生一系列的数据文件,有些文件不免具有重要性,但是如果我们只是简单的移动文件,那将不会具有很好的备份性,这里,我们借助Python实现对于文件的云端备份.      这个程序是我利 ...

  4. CF 579A Raising Bacteria

    题意:细菌爱好者在盒子里面培养细菌.最初盒子是空的,每天可以往盒子里面添加任意数目的细菌,而且每天每个细菌会分裂成两个.在某一时刻要想获得某一数量的细菌,要求最初放置的最少的细菌数目. 思路: 求出 ...

  5. 04747_Java语言程序设计(一)_第10章_网络与数据库编程基础

    例10.1说明InetAddress类的用法的应用程序. public class Example10_1 { public static void main(String args[]) { try ...

  6. UGUI 过渡动画插件,模仿NGUI的Tween (转载)

    最近在相亲,后来好朋友跟我说他写了一个好插件,于是我就把女朋友甩了,看看他的插件,可以在UGUI制作简单过渡动画. 我看了下是模仿NGUI的Tween, 我在筱程的基础上稍微改到人性化, 简单支持的让 ...

  7. go - 复合类型 array, slice, map

    Go 语言支持复合类型: 数组:array 切片:slice 指针:pointer 字典:map 通道:chan 结构体:struct 接口:interface 1. array   同一类型数据的集 ...

  8. QtXlsxWriter

    Code Issues26 Pull requests2   Pulse Graphs HTTPS clone URL You can clone with HTTPS orSubversion. C ...

  9. Docker网络管理-外部访问容器

    注意:这里使用的方法是端口映射,需要说明的是端口映射是在容器启动的时候才能完成端口映射的. 1,搭建1个web服务器,让外部机器访问. docker run -itd centos /bin/bash ...

  10. 一个项目涉及到的50个Sql语句(整理版)

    /* 标题:一个项目涉及到的50个Sql语句(整理版) 说明:以下五十个语句都按照测试数据进行过测试,最好每次只单独运行一个语句. */ --1.学生表Student(S,Sname,Sage,Sse ...