题意:n刀切割棋盘

下面是8*8的棋盘,每个数字代表棋盘对应点的权值,问切割n刀后,每一块的和  的均方差最小是多少

均方差的公式需要先化简:

由上式得,均方差最小 显然是要 Xi^2 最小

d[k][x1][y1][x2][y2]代表棋盘从(x1,y1)->(x2,y2)已经切了k刀 获得的最小的平方和

用sum[i][j] 代表 从(1,1)点 到 (i,j)点的权值和

这样答案就是 dp[n][1][1][8][8]/n  -(sum[8][8]/n)^2

用S[ (x1,y1) ,( x2,y2) ] 代表 这两点间的权值和

这里用递归dp

状态转移方程:

d[k][x1][y1][x2][y2]=

Min{  横向切: d[k-1] +剩下未切部分的平方和,纵向切:d[k-1]+剩下未切部分的平方和  }

横向切的最优解就是 Min{ d[ k-1,(x1,y1) , ( i ,y2) ] + S[ (i +1,y1) , ( x2 ,y2) ] ,  d[ k-1,(i+1,y1) , ( x2 ,y2) ] + S[ (x1,y1) , ( i ,y2) ] }  ( x1<= i <x2)

上面的意思就是: 在x=i处切一刀的最优解

同理可以容易推出纵向切法的dp方程

#include<stdio.h>
#include<math.h>
#include <string.h>
#define INF 1<<29
int map[9][9],sum[9][9];
int d[15][9][9][9][9];
inline int Min(int a,int b){return a>b?b:a;} int s(int x1,int y1,int x2,int y2){
int temp=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]; return temp*temp;
} int dp(int k,int x1,int y1,int x2,int y2){
if(d[k][x1][y1][x2][y2]!=-1)return d[k][x1][y1][x2][y2];
if(k==1)return s(x1,y1,x2,y2);
int ans=INF,i;
for(i=x1;i<x2;i++)
{
ans=Min(dp(k-1,x1,y1,i,y2)+s(i+1,y1,x2,y2),ans);
ans=Min(dp(k-1,i+1,y1,x2,y2)+s(x1,y1,i,y2),ans);
}
for(i=y1;i<y2;i++)
{
ans=Min(dp(k-1,x1,y1,x2,i)+s(x1,i+1,x2,y2),ans);
ans=Min(dp(k-1,x1,i+1,x2,y2)+s(x1,y1,x2,i),ans);
} return d[k][x1][y1][x2][y2]=ans;
}
int main()
{
int n,i,j,k;
while(~scanf("%d",&n)){
memset(map,0,sizeof(map));
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
scanf("%d",&map[i][j]); memset(sum,0,sizeof(sum));
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+map[i][j]; //得到sum数组 memset(d,-1,sizeof(d)); int ans=dp(n,1,1,8,8);
double aver=(double)sum[8][8]/(double)n;
double last=sqrt((double)ans/(double)n-aver*aver);
printf("%.3lf\n",last);
}
return 0;
}

HDU 2517 棋盘分割的更多相关文章

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

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

  2. POJ 1191 棋盘分割

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

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

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

  4. NOI 193棋盘分割.cpp

    193:棋盘分割 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分 ...

  5. POJ 1191棋盘分割问题

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

  6. 洛谷 P1436 棋盘分割 解题报告

    P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...

  7. [NOI1999] 棋盘分割

    COGS 100. [NOI1999] 棋盘分割 http://www.cogs.pro/cogs/problem/problem.php?pid=100 ★★   输入文件:division.in  ...

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

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

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

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

随机推荐

  1. [HDOJ - 5282] Senior's String 【DP】

    题目链接:BZOJ - 5282 题目分析 LCS 就是用经典的 O(n^2) DP 解决,f[i][j] 表示 x 串前 i 个字符与 y 串前 j 个字符的 LCS 长度. f[i][j] = m ...

  2. COOKIE之安全设置漫谈

    一.标题:COOKIE之安全设置漫谈 副标:httponly属性和secure属性解析 二.引言 经常有看到XSS跨站脚本攻击窃取cookie案例,修复方案是有httponly.今天写出来倒腾下... ...

  3. Fast CGI 工作原理

    http://www.cppblog.com/woaidongmao/archive/2011/06/21/149092.html 一.FastCGI是什么? FastCGI是语言无关的.可伸缩架构的 ...

  4. HDU4521+线段树+dp

    题意:在一个序列中找出最长的某个序列.找出的序列满足题中的条件. 关键:对于 第 i 个位置上的数,要知道与之相隔至少d的位置上的数的大小.可以利用线段树进行统计,查询.更新的时候利用dp的思想. / ...

  5. C内存管理

    一般而言,分配给进程的内存有四个概念上不同的区域,分别为:代码段.数据段.堆和栈,其中数据段又可以细分为初始化为非零的数据和初始化为零的数据.如下图所示: 1.栈区(stack)— 由编译器自动分配释 ...

  6. WPF——传实体类及绑定实体类属性

    public class User: private string _User; public string User1 { get { return _User; } set { _User = v ...

  7. JDK/bin目录下的不同exe文件的用途(转)

    新安装完JDk 大家是否发现安装目录的bin文件夹有很多exe文件 下面就为大家讲解不同exe文件的用途 javac:Java编译器,将Java源代码换成字节代 java:Java解释器,直接从类文件 ...

  8. OpenLayers 项目完整分析——(二)源代码总体结构分析

    转自:http://www.cnblogs.com/lzlynn/archive/2008/07/29/1255848.html 二)源代码总体结构分析 通过前面的项目介绍,我们大概已经知道Openl ...

  9. 搭建hdfs服务器集群的搭建+trash

    完全分布式搭建需要三台机器:node1.node2和node3 搭建时间之前首先要保持时间一致:date ntpdateyum install ntpdatentpdate -u ntp.sjtu.e ...

  10. [codevs1554]最佳课题选择

    题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同.具体地说,对于某个课题i ...