有 n 张牌,写有数字 a1,⋯,an。 每一轮操作,选择连续的三张牌,吃掉中间那张,然后把中间那张的数字加到其余两张上。 直到只剩两张牌为止。 目标是使得最后剩下的两张牌的数字和最小,输出最小的和。
2≤n≤18,0≤ai≤109 时限 2s
题解
最近 atcoder 的模型怎么都这么。。。
要考虑每张牌的贡献,实际上就是想要知道每张牌被算了多少次。
然后发现算这个贼麻烦,它对左右都有贡献,还跟顺序有关。。。
所以题解又给了个好办法。
一开始,最左和最右这两张牌都是贡献 1 次的。 对于当前区间 [l,r],枚举最后被吃掉的是哪张牌,假设是 i,那么 i 这张牌的贡献次数就是 l 的次数加上 r 的次数。 设 fl,r,x,y 表示当前 [l,r] 这个区间,l 被贡献了 x 次,r 被贡献了 y 次,所能达到的最小代价和。于是就枚举 i 然后 dp 下去了。