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 贪心的更多相关文章

  1. BZOJ1505: [NOI2004]小H的小屋

    BZOJ1505: [NOI2004]小H的小屋 Description 小H发誓要做21世纪最伟大的数学家.他认为,做数学家与做歌星一样,第一步要作好包装,不然本事再大也推不出去. 为此他决定先在自 ...

  2. [NOI2004]小H的小屋 贪心

    神仙贪心,洛谷没有插图导致我题一开始都没看懂.容易发现,块越多越优秀,然后为了满足题意,所以假如不能整除,就分为两个部分(能整除就直接均分就行了).前一部分是n/m,后一部分是n/m+1.数量也是固定 ...

  3. NOI2004 小H的小屋

    还是纯粹不会啊……到底该怎么办 http://blog.sina.com.cn/s/blog_86942b1401016m3g.html http://www.cnblogs.com/datam-cy ...

  4. 【Wannafly挑战赛10 - B】小H和密码(DP)

    试题链接:https://www.nowcoder.com/acm/contest/72/B 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1~N,每 ...

  5. [BZOJ4813][CQOI2017]小Q的棋盘(DP,贪心)

    4813: [Cqoi2017]小Q的棋盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 804  Solved: 441[Submit][Statu ...

  6. 小H和密码

    链接:https://www.nowcoder.com/acm/contest/72/B来源:牛客网 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1 ...

  7. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  8. 【BZOJ4813】[CQOI2017]小Q的棋盘(贪心)

    [BZOJ4813][CQOI2017]小Q的棋盘(贪心) 题面 BZOJ 洛谷 题解 果然是老年选手了,这种题都不会做了.... 先想想一个点如果被访问过只有两种情况,第一种是进入了这个点所在的子树 ...

  9. hdu2067 小兔的棋盘 DP/数学/卡特兰数

    棋盘的一角走到另一角并且不越过对角线,卡特兰数,数据量小,可以当做dp求路径数 #include<stdio.h> ][]; int main() { ; ) { int i,j; lon ...

随机推荐

  1. 常用API - Arrays、Math、Object

    Arrays类 概述 此类包含用来操作数组(比如排序和搜索)的各种方法.此类还包含一个允许将数组作为列表来查看的静态工厂. 除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 Nu ...

  2. 带你学够浪:Go语言基础系列 - 10分钟学方法和接口

    文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 对于一般的语言使用者来说 ,20% 的语言特性就能够满 ...

  3. rpm部分命令解读

    rpm部分命令解读 rpm---RedHat Package Manger---打包及安装工具 rpm参数列表   rpm -a rpm -q < rpm package name> 解读 ...

  4. 关键字 package 和 import

    1. package的使用 1.1 使用说明: * 1.为了更好的实现项目中类的管理,提供包的概念 * 2.使用package声明类或接口所属的包,声明在源文件的首行 * 3.包,属于标识符,遵循标识 ...

  5. [POJ1852] Ants(思维题)

    题干 An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. W ...

  6. 快来!我从源码中学习到了一招Dubbo的骚操作!

    荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 55 篇. 老规矩,先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩. 魔幻的 2020 年的上半年过去了,很多人都在朋友圈和上半 ...

  7. Jmeter(十六) - 从入门到精通 - JMeter前置处理器(详解教程)

    1.简介 前置处理器是在发出“取样器请求”之前执行一些操作.如果将前置处理器附加到取样器元件,则它将在该取样器元件运行之前执行.前置处理器最常用于在取样器请求运行前修改其设置,或更新未从响应文本中提取 ...

  8. HTTP协议——详细版

    一 HTTP协议简介 作为学习前端开发的开始,我们必须搞明白以下几件事 1.什么是互联网      互联网=物理连接介质+互联网协议 2.互联网建立的目的?         数据传输打破地域限制,否则 ...

  9. Redis 相关运维操作

    背景 Redis作为目前全球最流行的KV存储,除了使用之外,还需要做好日常的运维工作.关于运维相关的工作,本文从以下方面进行介绍说明(Redis5.0以上): 内存方面 客户端连接方面 工具方面 说明 ...

  10. 重学c#系列——c# 托管和非托管资源(三)

    前言 c# 托管和非托管比较重要,因为这涉及到资源的释放. 现在只要在计算机上运行的,无论玩出什么花来,整个什么概念,逃不过输入数据修改数据输出数据(计算机本质),这里面有个数据的输入,那么我们的内存 ...