HDU 2517 棋盘分割
题意: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 棋盘分割的更多相关文章
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- POJ 1191 棋盘分割
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11213 Accepted: 3951 Description 将一个 ...
- poj 1191 棋盘分割 动态规划
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11457 Accepted: 4032 Description ...
- NOI 193棋盘分割.cpp
193:棋盘分割 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分 ...
- POJ 1191棋盘分割问题
棋盘分割问题 题目大意,将一个棋盘分割成k-1个矩形,每个矩形都对应一个权值,让所有的权值最小求分法 很像区间DP,但是也不能说就是 我们只要想好了一个怎么变成两个,剩下的就好了,但是怎么变,就是变化 ...
- 洛谷 P1436 棋盘分割 解题报告
P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...
- [NOI1999] 棋盘分割
COGS 100. [NOI1999] 棋盘分割 http://www.cogs.pro/cogs/problem/problem.php?pid=100 ★★ 输入文件:division.in ...
- poj1191 棋盘分割【区间DP】【记忆化搜索】
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16263 Accepted: 5812 Description ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
随机推荐
- uva 12648
一个简单的搜索: 反正树的结构不会变,只需要把节点的名称换一下就行: 可惜比赛的时候思路不清晰: #include<cstdio> #define maxn 5050 #include&l ...
- Firefly官方教程之Distributed使用文档
原地址:http://bbs.gameres.com/thread_224191.html distributed使用文档1.distributed说明该模块主要封装了各个服务进程间进行通信的方法.n ...
- MSSql2008打开企业管理器出错,具体显示提示无法识别的配置节 system.serviceModel。
MSSql2008打开企业管理器出错详细信息: 标题: 已注册的服务器 ------------------------------ 无法读取此系统上以前注册的服务器的列表.请在“已注册的服务器” ...
- 李洪强iOS开发之提交AppStory时候遇到的坑
今天我在上传AppStore的时候,遇到了很多的问题.一直找不到问题的原因,但是最后终于发现问题的原因 ,是因为钥匙串签名无效的问题,解决方案如下: 证书签名无效解决: 1,按照你那个链接下载,htt ...
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-002-AOP术语解析
一. 1.Advice Advice是切面的要做的操作,它定义了what.when(什么时候要做什么事) aspects have a purpose—a job they’re meant to d ...
- ANDROID_MARS学习笔记_S01原始版_011_XML
一.代码 1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- 【原创】FPGA开发手记(二) VGA接口
以下内容均以Xilinx的Nexys3作为开发板 1.VGA接口介绍 首先,先看电路图(3*5为例): 标准VGA一共15个接口,但是实际应用的接口信号只用五个:HSYNC,行同步信号:VSYNC,场 ...
- 使用C#在word中插入页眉页脚
//插入页脚 public void InsertFooter(string footer) { if (ActiveWindow.ActivePane.View.Type == WdViewType ...
- [HUST 1017] Exact cover
Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 6012 Solved: 3185 DESCRIP ...
- C#中使用自定义的纸张大小
using System.Drawing.Printing; using System.Drawing; private void Test() { PrintDocument m_pdoc = ne ...