博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小区划分 计蒜客提高组模拟赛(三)Day2 动态规划 区间DP NOIP模拟赛
阅读量:5735 次
发布时间:2019-06-18

本文共 1922 字,大约阅读时间需要 6 分钟。

一条街道的两侧各连续坐落着 N座单元楼。现在要为这些单元楼划分居民校区。

规则如下:

1.     每个小区只能由同一侧连续的若干座单元楼组成。且两侧都恰有 K个小区(每个小区至少有一栋楼)。

2.     两侧的小区划分规则应该相同,比如,若左边的房子被分成 {1,2},{3} 这两个小区,那么右边也应该如此。

这样两边合计一共有 K对小区。

用 ai,bi 表示左右两边每座楼的人口在同侧所有单元楼总人口中所占的百分比,定义一个小区的相对拥挤程度为其人口百分比之和(左边就是对应ai 的和,右边是对应 bi 的和)。定义这条街道的总拥挤程度为左右两边 K对小区的相对拥挤程度之差的绝对值之和。

现在,请你求出可能的最大拥挤程度。

一道简单的动态规划题目。 首先介绍 cmath 库中的一个命令 fabs() , 这玩意儿是专门给浮点数(double)求绝对值的。

我们先把街道两侧的单元楼的人口百分比之和 a、b 做一个前缀和,便于以后的状态转移。设其分别为 suma、sumb

设 dp[i][v] 表示前i座单元楼中划分出v个小区的最大拥挤度,那么显然会先有一个限制条件,即 v≤i 。

转移方程:  dp[i][v]=max(dp[i][v],dp[j][v-1]+fabs(suma[i]-suma[j]-(sumb[i]-sumb[j]))) 其中 j∈[v-1,i-1]

初始值就是 dp[1~n][1]=fabs(suma[i]-sumb[i])

也就是说,i的状态是由他之前的合法状态转移过来,i分v个小区,那么就从之前j分的v-1个小区转移过来的方案中取最优方案。

最后输出答案 dp[n][k] 即可。

附上AC代码

1 #include
2 #include
3 #include
4 using namespace std; 5 template
inline void read(T &_a){ 6 bool f=0;int _ch=getchar();_a=0; 7 while(_ch<'0' || _ch>'9'){
if(_ch=='-')f=1;_ch=getchar();} 8 while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();} 9 if(f)_a=-_a;10 }11 12 const int maxn=801;13 int n,k;14 double a[maxn],b[maxn],suma[maxn],sumb[maxn],dp[maxn][81];15 16 int main()17 {18 freopen("dis.in","r",stdin);19 freopen("dis.out","w",stdout);20 read(n); read(k);21 for (register int i=1;i<=n;++i) scanf("%lf",&a[i]);22 for (register int i=1;i<=n;++i) scanf("%lf",&b[i]);23 for (register int i=1;i<=n;++i) suma[i]=suma[i-1]+a[i],sumb[i]=sumb[i-1]+b[i];24 for (register int i=1;i<=n;++i)25 {26 dp[i][1]=fabs(suma[i]-sumb[i]);27 for (register int v=2;v<=k&&v<=i;++v)28 for (register int j=i-1;j>=v-1;--j)29 dp[i][v]=max(dp[i][v],dp[j][v-1]+fabs(suma[i]-suma[j]-(sumb[i]-sumb[j])));30 }31 printf("%lf",dp[n][k]);32 return 0;33 }
View Code

转载于:https://www.cnblogs.com/jaywang/p/7748383.html

你可能感兴趣的文章
计算A/B Test需要的样本量
查看>>
二叉树前序中序后序遍历的非递归方法
查看>>
mysql 行转列列转行
查看>>
《设计模式系列》---桥接模式
查看>>
[Unity3d]Shader 着色器 学习前了解知识
查看>>
Linux中文件颜色所代表的属性和颜色
查看>>
Redrain duilib中事件委托存在的问题
查看>>
43、我的C#学习笔记9
查看>>
网站建表实践及优化
查看>>
字符串的简单操作
查看>>
C#新功能--命名参数与可选参数
查看>>
strtok和strtok_r
查看>>
维辰超市:借助云商城成功转型新零售
查看>>
web.xml中<load-on-start>n</load-on-satrt>作用
查看>>
python之路---进程
查看>>
1061. Dating (20)
查看>>
leetcode 【 Best Time to Buy and Sell Stock II 】python 实现
查看>>
【算法】CRF
查看>>
windows 8 微软拼音输入法
查看>>
Windows UI风格的设计(7)
查看>>