题目名称 413. [HAOI 2009]巧克力
输入输出 chocolate.in/out
难度等级 ★★☆
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 10
题目来源 Gravatar.Xmz 于2010-03-22加入
开放分组 全部用户
提交状态
分类标签
HAOI 贪心
分享题解
通过:123, 提交:202, 通过率:60.89%
GravatarGe0Bi1Lao0W 100 0.000 s 0.00 MiB C++
GravatarHeHe 100 0.000 s 0.00 MiB C++
GravatarBennettz 100 0.000 s 0.00 MiB C++
Gravatarkxxy 100 0.000 s 0.00 MiB C++
GravatarSamle 100 0.000 s 0.00 MiB C++
GravatarYoungsc 100 0.000 s 0.00 MiB C++
Gravatar瑆の時間~無盡輪迴·林蔭 100 0.002 s 0.32 MiB C++
GravatarJobs.T 100 0.002 s 0.47 MiB C++
GravatarBFZD 100 0.004 s 0.39 MiB C++
GravatarFmuckss 100 0.004 s 0.42 MiB C++
关于 巧克力 的近10条评论(全部评论)
感觉可以这么证(xia)明(gao),
对于每个Xi Yj的交点(i,j),可以选择先切Xi或先切Yj,且该决策不影响任何其他决策。对于当前最大值,不妨设为Xi(或Yj亦可),因为剩下的Yp1,Yp2…均小于Xi,所以对应决策均为先切Xi
Gravatar『』
2018-04-12 09:18 10楼
贪心,排序一遍就很简单。
Gravatarxzz_233
2017-02-06 13:20 9楼
暴力dp出奇迹- -
似乎换种dp方式就能deque优化做到O(n)了
GravatarFoolMike
2017-01-23 09:30 8楼
哔哔哔
Gravatar蓝T-shirt
2016-07-04 16:33 7楼
噗...第一次交忘了n+m总和是2e4....
GravatarFmuckss
2016-03-30 09:30 6楼
想必看完楼上们的评论,大家对这道题的算法已经饥渴难耐了,为了满足大家的兽欲,这里我给出一个简易版的证明(没有按照严格的贪心算法的证明方法走)。
设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楼的贪心算法大部分还是正确的,除了少量细节(情况一),不过我们是真男人,何必在意这些细节!
Gravatar超级傲娇的AC酱
2014-02-06 14:50 5楼
这道题贪心的证明不是很简单么。。。反证不等式推矛盾。。。
Gravatarzjmfrank2012
2014-02-06 09:35 4楼
有谁能证明这个贪心的正确性?
不能证明正确性的贪心总是心里感觉不爽。
GravatarMongo
2014-01-26 11:44 3楼
Gravatarfeng
2013-03-05 11:14 2楼
贪心,不管横竖,选择最大的先切(有相等无所谓,当有几个相等的最大值时,随便选一个)
完事儿,AC。
GravatarTruth.Cirno
2011-11-09 08:47 1楼

413. [HAOI 2009]巧克力

★★☆   输入文件:chocolate.in   输出文件:chocolate.out   简单对比
时间限制:1 s   内存限制:128 MiB

【题目描述】

有一块 $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$。