题目名称 | 413. [HAOI 2009]巧克力 |
---|---|
输入输出 | chocolate.in/out |
难度等级 | ★★☆ |
时间限制 | 1000 ms (1 s) |
内存限制 | 128 MiB |
测试数据 | 10 |
题目来源 | .Xmz 于2010-03-22加入 |
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:123, 提交:202, 通过率:60.89% | ||||
Ge0Bi1Lao0W | 100 | 0.000 s | 0.00 MiB | C++ |
HeHe | 100 | 0.000 s | 0.00 MiB | C++ |
Bennettz | 100 | 0.000 s | 0.00 MiB | C++ |
kxxy | 100 | 0.000 s | 0.00 MiB | C++ |
Samle | 100 | 0.000 s | 0.00 MiB | C++ |
Youngsc | 100 | 0.000 s | 0.00 MiB | C++ |
瑆の時間~無盡輪迴·林蔭 | 100 | 0.002 s | 0.32 MiB | C++ |
Jobs.T | 100 | 0.002 s | 0.47 MiB | C++ |
BFZD | 100 | 0.004 s | 0.39 MiB | C++ |
Fmuckss | 100 | 0.004 s | 0.42 MiB | C++ |
关于 巧克力 的近10条评论(全部评论) | ||||
---|---|---|---|---|
感觉可以这么证(xia)明(gao),
对于每个Xi Yj的交点(i,j),可以选择先切Xi或先切Yj,且该决策不影响任何其他决策。对于当前最大值,不妨设为Xi(或Yj亦可),因为剩下的Yp1,Yp2…均小于Xi,所以对应决策均为先切Xi
『』
2018-04-12 09:18
10楼
| ||||
贪心,排序一遍就很简单。
| ||||
暴力dp出奇迹- -
似乎换种dp方式就能deque优化做到O(n)了 | ||||
哔哔哔
| ||||
噗...第一次交忘了n+m总和是2e4....
| ||||
想必看完楼上们的评论,大家对这道题的算法已经饥渴难耐了,为了满足大家的兽欲,这里我给出一个简易版的证明(没有按照严格的贪心算法的证明方法走)。
设K为某种状态下的常数,其大小与巧克力当前状态下x,y方向上的块数大小有关。 情况1设$X_{n},X_{n+1}$为相邻位(n+1为n的第一个小于的元素),$W_{n}$为切完第n刀后的权值和。 可知切2刀之前状态与切2到之后的状态相同,与中间决策无关。 决策1$W_{n,first}=W_{n-1}+K*(X_{n}+X_{n+1})$ 决策2$W_{n,second}=W_{n-1}+K*(X_{n+1}+X{n})$ $W_{n,first}=W_{n,second}$;这种情况下两种决策效果相同。 情况2设$X_{n},Y_{m}$为相邻位(定义同上,但在这可以假设2大小关系未知),$W_{n}$为切完第n刀后的权值和。 可知切2刀之前状态与切2到之后的状态相同,与中间决策无关。 决策1$W_{n,first}=W_{n-1}+K*(X_{n}+2*Y_{m})$等式1 决策2$W_{n,second}=W_{n-1}+K*(Y_{m}+2*X{n})$等式2 等式1与等式2同时减去相同部分得 $First=K*Y_{m}$等式3 $Second=K*X_{n}$等式4 此时可知W值与决策有关,既若使某状态下W值越小,则应先从大的切起。 对于全局的决策,可以分为数个阶段,在这里可以证明: 若$W_{n}$最优,则$W_{n-1}$最优(反证法:由于决策过程权值是确定的,若存在更优$W_{n-1}$,则$W_{n}$不为最优,与前提矛盾) $W_{n-1}$最优且使用最优决策,则$W_{n}$最优。 由此可递推得最终可以获得最优答案(可以用类似循环不变量的东西,这个比较开放了~) 最终得到巧克力问题满足局部最优解亦是全局最优解,该贪心算法成立。 看来2楼的贪心算法大部分还是正确的,除了少量细节(情况一),不过我们是真男人,何必在意这些细节! | ||||
这道题贪心的证明不是很简单么。。。反证不等式推矛盾。。。
zjmfrank2012
2014-02-06 09:35
4楼
| ||||
有谁能证明这个贪心的正确性?
不能证明正确性的贪心总是心里感觉不爽。
Mongo
2014-01-26 11:44
3楼
| ||||
| ||||
贪心,不管横竖,选择最大的先切(有相等无所谓,当有几个相等的最大值时,随便选一个)
完事儿,AC。 |
有一块 $n*m$ 的矩形巧克力,准备将它切成 $n*m$ 块。巧克力上共有 $n-1$ 条横线和 $m-1$ 条竖线,你每次可以沿着其中的一条横线或竖线将巧克力切开,无论切割的长短,沿着每条横线切一次的代价依次为 $y_1,y_2,…,y_{n-1}$,而沿竖线切割的代价依次为 $x_1,x_2,…,x_{m-1}$。例如,对于下图 $6*4$ 的巧克力,我们先沿着三条横线切割,需要 $3$ 刀,得到 $4$ 条巧克力,然后再将这 $4$ 条巧克力沿竖线切割,每条都需要 $5$ 刀,则最终所花费的代价为 $y_1+y_2+y_3+4*(x_1+x_2+x_3+x_4+x_5)$。
当然,上述简单切法不见得是最优切法,那么怎样切割该块巧克力,花费的代价最少呢?
第一行为两个整数 $n$ 和 $m$。
接下来 $n-1$ 行,每行一个整数,分别代表 $x_1,x_2,…,x_{n-1}$。
接下来 $m-1$ 行,每行一个整数,分别代表 $y_1,y_2,…,y_{m-1}$。
输出一整数,为切割巧克力的最小代价。
6 4 2 1 3 1 4 4 1
42
$30\%$ 的数据,$n \leq 100,m \leq 100$;
$100\%$ 的数据,$n \leq 10000,m \leq 10000$。