P4274 [NOI2004]小H的小屋 dp 贪心
LINK:小H的小屋
尽管有论文 但是 其证明非常的不严谨 结尾甚至还是大胆猜测等字样...
先说贪心:容易发现m|n的时候此时均分两个地方就是最优的。
关于这个证明显然m在均分的时候的分点一定是n的子集 考虑不为均分的时候答案一块增多一个增少 但是增多的幅度显然更大 所以的证。
然后 当m不整除n的时候 容易想到还是均分的思路 不过 这次 对于一部分均分到的是 n/m 一部分是n/m+1.
然后暴力枚举中间的分点即可 然后进行计算。
这样复杂度O(100) 异常优秀。
考虑不那么优秀的dp.
容易想到 每放一块北墙对应多块南墙 设状态 f[i][j][k]表示前i块北墙j块南墙此时端点在j的最小值。
这状态转移是n^5的 不过大力跑也能A.值得注意的是 在状态转移的时候需要预处理一下数组g[i][j]表示i个南墙分j个距离的最小值。
因为题目中明确说了 分的位置必须为整数。当然直接计算也是可以依靠分成两段计算也行。可以发现那样也是最优的。
考虑优化 考虑优化j的状态转移 当k递增时 j的转移必然递增。
考虑到 如果j减小了那么造成对于更小的面积用更多的墙 这显然不是最优的。
所以此时总复杂度n^4.
值得注意的是 还可以优化 对于 i,j,k固定的时候 j,k的决策一定不会比 i+1,j,k的决策更大 所以再开个数组存上次的决策来优化转移。
这个证明不太会。
n^4的做法 显然可过嘛.
const int MAXN=310000,G=3;
int m,n;
db ans,k1,k2,s1;
db f[102][102][102];//f[i][j][k]表示 前i个北墙 前j个南墙 现在到达点k的最小面积
db g[102][102];
//int g[101][101][101][2];//g[i][j][k]表示 这个状态的最优决策
int main()
{
freopen("1.in","r",stdin);
gi(k1);//北
gi(k2);//南
gt(m);//北
gt(n);//南
//m<=n;
if(n%m==0)
{
db w2=100.0/(n*1.0);
db w1=100.0/(m*1.0);
ans=w2*k2*n*w2+w1*w1*k1*m;
printf("%.1lf\n",ans);
return 0;
}
rep(0,m,i)rep(0,n,j)rep(0,100,k)f[i][j][k]=INF;
rep(0,n,i)rep(0,100,k)g[i][k]=INF;
g[0][0]=0;
rep(1,n,i)rep(i,100,j)
rep(1,j,k)g[i][j]=min(g[i][j],g[i-1][j-k]+k*k*k2);
f[0][0][0]=0;
rep(1,m,i)//北墙
rep(i,n,j)//南墙
{
rep(j,100,k)
{
//枚举北墙的决策得到南墙的决策.
//cout<<f[i][j][k]<<endl;
int w2=1;//w2逐渐增大
rep(1,k,w1)//w1决策增大的时候 w2决策不会减小
{
while(g[w2+1][w1]+f[i-1][j-w2-1][k-w1]<f[i-1][j-w2][k-w1]+g[w2][w1]&&w2+1<=j)++w2;
//rep(1,j,w2)
f[i][j][k]=min(f[i][j][k],f[i-1][j-w2][k-w1]+g[w2][w1]+(db)w1*k1*w1);
//if(i<=1&&j<=1&&k<=10)cout<<f[i-1][j-w2][k-w1]<<' '<<f[ i][j][k]<<' '<<i<<' '<<j<<' '<<k<<' '<<w2<<' '<<j-w2<<' '<<k-w1<<endl;
}
}
}
printf("%.1lf",f[m][n][100]);
return 0;
}
P4274 [NOI2004]小H的小屋 dp 贪心的更多相关文章
- BZOJ1505: [NOI2004]小H的小屋
BZOJ1505: [NOI2004]小H的小屋 Description 小H发誓要做21世纪最伟大的数学家.他认为,做数学家与做歌星一样,第一步要作好包装,不然本事再大也推不出去. 为此他决定先在自 ...
- [NOI2004]小H的小屋 贪心
神仙贪心,洛谷没有插图导致我题一开始都没看懂.容易发现,块越多越优秀,然后为了满足题意,所以假如不能整除,就分为两个部分(能整除就直接均分就行了).前一部分是n/m,后一部分是n/m+1.数量也是固定 ...
- NOI2004 小H的小屋
还是纯粹不会啊……到底该怎么办 http://blog.sina.com.cn/s/blog_86942b1401016m3g.html http://www.cnblogs.com/datam-cy ...
- 【Wannafly挑战赛10 - B】小H和密码(DP)
试题链接:https://www.nowcoder.com/acm/contest/72/B 题目描述 小H在击败怪兽后,被一个密码锁挡住了去路 密码锁由N个转盘组成,编号为1~N,每 ...
- [BZOJ4813][CQOI2017]小Q的棋盘(DP,贪心)
4813: [Cqoi2017]小Q的棋盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 804 Solved: 441[Submit][Statu ...
- 小H和密码
链接:https://www.nowcoder.com/acm/contest/72/B来源:牛客网 题目描述 小H在击败怪兽后,被一个密码锁挡住了去路 密码锁由N个转盘组成,编号为1 ...
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...
- 【BZOJ4813】[CQOI2017]小Q的棋盘(贪心)
[BZOJ4813][CQOI2017]小Q的棋盘(贪心) 题面 BZOJ 洛谷 题解 果然是老年选手了,这种题都不会做了.... 先想想一个点如果被访问过只有两种情况,第一种是进入了这个点所在的子树 ...
- hdu2067 小兔的棋盘 DP/数学/卡特兰数
棋盘的一角走到另一角并且不越过对角线,卡特兰数,数据量小,可以当做dp求路径数 #include<stdio.h> ][]; int main() { ; ) { int i,j; lon ...
随机推荐
- 状压DP之排列perm
题目 [SCOI2007]排列 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. 输 ...
- Django---进阶3
目录 无名有名分组反向解析 路由分发 名称空间(了解) 伪静态(了解) 虚拟环境(了解) django版本区别 视图层 三板斧 JsonResponse对象 form表单上传文件及后端如何操作 req ...
- day60 django入门
目录 一.静态文件配置 1 引子 2 如何配置 1 在settins.py中的具体配置 2 静态文件的动态解析(html页面中) 二.request对象方法初识 三.pycharm链接数据库(mysq ...
- ReadWriteLock锁的应用
对于 Lock 锁来说,如果要实现 "一写多读" 的并发状态(即允许同时读,不允许同时写),需要对 "写操作" 加锁,对 "读操作" 不作要 ...
- mysql语句批量产生大量测试数据
CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, ` ...
- mysql数据的增删改-内含经典面试题
#DML语言 /* 数据操作语言: 插入:insert 修改:update 删除:delete */ #一.插入语句 #方式一:经典的插入 /* 语法: insert into 表名(列名,...) ...
- 01-MySQL支持的数据类型
1.数值类型 整数类型 MySQL 支持的整数类型有 SQL 标准中的整数类型 INTEGER,SMALLINT,TINYINT.MEDIUMINT和BIGINT.其整数类型的特性如下表所示: 在上述 ...
- 在Java中使用AES加密
本文转载https://blog.csdn.net/z69183787/article/details/82746686
- 关于springboot中过滤器和拦截器
在解决跨域问题中,发现拦截器和过滤器用得不是熟练.就参考了下一下两个作者的文档.希望大家也可以汲取精华 文档1 https://blog.csdn.net/moonpure/article/det ...
- bzoj1682[Usaco2005 Mar]Out of Hay 干草危机*
bzoj1682[Usaco2005 Mar]Out of Hay 干草危机 题意: 给个图,每个节点都和1联通,奶牛要从1到每个节点(可以走回头路),希望经过的最长边最短. 题解: 求最小生成树即可 ...