发现最近好少写博客啊(其实是各种摆去了)

更一点吧

这道题要求最小化均方差,其实凭直觉来说就是要使每个块分的比较均匀一点,但是单单想到想到这些还是不够的,

首先f[i][j][k][l][t]表示以(i,j)为左上角,(k,l)为右下角,一共分割的t次的矩形的最小xx,

其中xx是某个与最小均方差挂钩的东西,

通常这种要求推式子的题目都要从小的情况推广到所有情况。

这道题也是一样的,

对于一个被分为x1和x2的矩形而言(分割了一次),用X表示平均数,

那么X=权值和/块数,

那么方差为:[(X - x1)^2 + (X - x2)^2]    /    块数

对于固定的分割次数而言,块数是固定的,所以不管它,

那么我们就是要化简[(X - x1)^2 + (X - x2)^2]

原式=X^2 + x1^2 - 2 * X * x2 + X^2 + x2^2 - 2 * X * x2

=2(X ^ 2) + (x1^2 + x2^2) - 2 * X * (x1 + x2)

观察到x1+ x2就是权值和,是固定的,

而因为块数固定,X也是固定的,因此我们唯一可以改变的就是中间的平方部分,

所以我们的问题就转化为了一个矩形分割n-1次,求最小的平方和,

于是就可以直接dp了

f[i][j][k][l][t]表示以(i,j)为左上角,(k,l)为右下角,一共分割的t次的矩形的最小平方和,

同时为了满足dp性质(要求大状态先求小状态),左上角要倒着枚举,然后右下角正着枚举,

然后枚举分割线,枚举每块小矩形分割了多少次,最后计算一下即可

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 11
int ll,rr,n;
int f[AC][AC][AC][AC][AC];
int s[AC][AC],sum[AC][AC];
double ans,x;
/*以分两块(分别含有两小块)的合成为例
f[x]=((X - x1) ^ 2 + (X - x2) ^ 2)/2
对分子化简得:2 * X ^ 2 + x1 ^ 2 + x2 ^ 2 - 2 * X * (x1 + x2),
可以发现x1 + x2就是这一块的权值和,X为平均值,也就是权值和/块数,
也就是说对于任意一种分法,影响最终答案的只有x1 ^ 2 + x2 ^ 2这种,
所以只要最小化这个就可以了*/ inline void upmin(int &a,int b)
{
if(b < a) a=b;
} void pre()
{
memset(f,,sizeof(f));
scanf("%d%d%d",&ll,&rr,&n);
for(R i=;i<=ll;i++)
for(R j=;j<=rr;j++)
scanf("%d",&s[i][j]);
for(R i=;i<=ll;i++)
for(R j=;j<=rr;j++)
sum[i][j]=s[i][j] + sum[i-][j] + sum[i][j-] - sum[i-][j-];
for(R i=;i<=ll;i++)
for(R j=;j<=rr;j++)
for(R k=i;k<=ll;k++)
for(R l=j;l<=rr;l++)
{
int a=sum[k][l] - sum[i-][l] - sum[k][j-] + sum[i-][j-];
f[i][j][k][l][]=a * a;
}
/*for(R i=1;i<=ll;i++)
{
for(R j=1;j<=rr;j++)
{
printf("%d ",sum[i][j]);
}
printf("\n");
}*/
} void work()
{
for(R t=;t<n;t++)
for(R i=ll; i ;i--)//为了维护dp的条件,左上角应该要倒着枚举吧
for(R j=rr; j ;j--)//枚举左上角
{
for(R k=i;k<=ll;k++)
for(R l=j;l<=rr;l++)//枚举右上角
{
if(i == k && j == l) continue;
for(R p=j;p<l;p++)//枚举竖着的分界线
for(R tt=;tt<t;tt++)//原来的两块切割次数之和只能为t-1,因为现在切的就是第t次
upmin(f[i][j][k][l][t],f[i][j][k][p][tt] + f[i][p+][k][l][t - tt - ]);
for(R p=i;p<k;p++)//枚举横着的分界线
for(R tt=;tt<t;tt++)//枚举两块分别切了多少次,注意从0开始!!!
upmin(f[i][j][k][l][t],f[i][j][p][l][tt] + f[p+][j][k][l][t - tt - ]);
//printf("%d %d %d %d %d = %d\n",i,j,k,l,t,f[i][j][k][l][t]);
}
}
x=(double)sum[ll][rr] / (double)n;//获取平均值
ans=(double)(n * x * x) + (double)f[][][ll][rr][n-] - (double) * x * sum[ll][rr];
ans/=(double)n;
ans=sqrt(ans);
printf("%.2lf\n",ans);
} int main()
{
// freopen("in.in","r",stdin);
pre();
work();
// fclose(stdin);
return ;
}

[HAOI2007]分割矩阵 DP+推式子的更多相关文章

  1. LuoguP2217 [HAOI2007]分割矩阵 (DP + memorized search)

    int n,m,tim; int mp[N][N], sum[N][N]; double ave,dp[N][N][N][N][N]; inline double DP(int a,int b,int ...

  2. bzoj千题计划186:bzoj1048: [HAOI2007]分割矩阵

    http://www.lydsy.com/JudgeOnline/problem.php?id=1048 #include<cmath> #include<cstdio> #i ...

  3. 【BZOJ1048】 [HAOI2007]分割矩阵

    [BZOJ1048][HAOI2007]分割矩阵 题面 bzoj 洛谷 题解 \(dp[a][b][c][d][num]\)表示将矩形\((a,b,c,d)\)分成\(num\)个的最小方差,然后转移 ...

  4. BZOJ 1048 [HAOI2007]分割矩阵

    1048: [HAOI2007]分割矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 623  Solved: 449[Submit][Status ...

  5. 洛谷P2217 [HAOI2007]分割矩阵

    P2217 [HAOI2007]分割矩阵 题目描述 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个),这样分割了(n ...

  6. [BZOJ 1048] [HAOI2007] 分割矩阵 【记忆化搜索】

    题目链接:BZOJ - 1048 题目分析 感觉这种分割矩阵之类的题目很多都是这样子的. 方差中用到的平均数是可以直接算出来的,然后记忆化搜索 Solve(x, xx, y, yy, k) 表示横坐标 ...

  7. BZOJ1048:[HAOI2007]分割矩阵(记忆化搜索DP)

    Description 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个), 这样分割了(n-1)次后,原矩阵被分割成 ...

  8. 【题解】HAOI2007分割矩阵

    水题盛宴啦啦啦……做起来真的极其舒服,比某些毒瘤题好太多了…… 数据范围极小 --> 状压 / 搜索 / 高维度dp:观察要求的均方差,开始考虑是不是能够换一下式子.我们用\(a_{x}\)来表 ...

  9. 【BZOJ】1048: [HAOI2007]分割矩阵

    http://www.lydsy.com/JudgeOnline/problem.php?id=1048 题意:给出一个a×b(a,b<=10)的矩阵,带一个<=100的权值,现在要切割n ...

随机推荐

  1. E2E test protractor selenium

    E2E Test和传统的Unit Test不同的是:(1)不涉及代码层面,不会去测试某段代码是否正确或者某行代码是否被覆盖(2)它是从用户的角度出发,用来测试一个应用的流程是否符合预期. 一 Sele ...

  2. 一文带你了解 Raft 一致性协议的关键点

    此文已由作者孙建良授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Raft 协议的发布,对分布式行业是一大福音,虽然在核心协议上基本都是师继 Paxos 祖师爷(lampor ...

  3. Linux命令应用大词典-第40章 网络客户端

    40.1 elinks:字符模式的Web浏览器 40.2 wget:从Web网站下载文件 40.3 curl:传输URL 40.4 lynx:通用分布式信息的万维网浏览器 40.5 lftp:实现文件 ...

  4. 解析范式(1NF-4NF)

    亲爱的盆友们~又是新的一年,你,准备好新的学习计划了吗~?是读书100本,还是考上5个证?嘛~不管怎么说,角落里那一堆蒙尘的计划表好像在昭示着这仍然是一个充满朝气又艰难的9102年呢!总之,先把#技本 ...

  5. Attention注意力机制介绍

    什么是Attention机制 Attention机制通俗的讲就是把注意力集中放在重要的点上,而忽略其他不重要的因素.其中重要程度的判断取决于应用场景,拿个现实生活中的例子,比如1000个人眼中有100 ...

  6. Matlab结构体定义

    定义一个Matlab结构体的代码,以飞行器为例: classdef flightpro properties pos = [ ]; RGB = [ ]; rate; type; end end

  7. 2. socket结构体——表示socket地址

    一.两种通用socket结构体 1. sockaddr struct sockaddr { sa_family_t sa_family; // 地址族 char sa_data[14]; // 存放s ...

  8. Scrum1

    Scrum1 组员 任务分工 贡献 林泽宇 团队分工.撰写博客.修改完善需求规格说明书.整理代码规范 李涵 后端架构设计 尹海川 logo设计修改.数据库数据 郏敏杰 课堂展示.查阅资料.整理关键和难 ...

  9. 算法与数据结构实验题 6.3 search

    ★实验任务 可怜的 Bibi 刚刚回到家,就发现自己的手机丢了,现在他决定回头去搜索 自己的手机. 现在我们假设 Bibi 的家位于一棵二叉树的根部.在 Bibi 的心中,每个节点 都有一个权值 x, ...

  10. 用URL传参带特殊字符,特殊字符丢失

    文章:URL中编码URL特殊字符 文章:用URL传参带特殊字符,特殊字符丢失(encode) 如果url中有特殊字符,需要对url进行编码,否则特殊字符丢失,导致最终接收到的值不对.