CF710E Generate a String 题解

一道比较不错的 DP。

f i f_i fi 表示当前字符串长为 i i i 时的最小代价,发现这道题麻烦的地方在于 f i f_i fi 可以从 f i + 1 f_{i+1} fi+1 的地方转移过来。

分类讨论一下:


i i i 为偶数:

i i i 为偶数时 f i f_i fi 能从 f i − 1 , f i 2 , f i + 1 f_{i-1},f_{\frac{i}{2}},f_{i+1} fi1,f2i,fi+1 三个点转移过来,但是 f i + 1 f_{i+1} fi+1 的转移路程是 ? → f i + 2 2 → f i + 2 → f i + 1 → f i ? \to f_{\frac{i+2}{2}} \to f_{i+2} \to f_{i+1} \to f_{i} ?f2i+2fi+2fi+1fi
,总代价是 y + 2 x y+2x y+2x,这显然不如 ? → f i + 2 2 → f i 2 → f i ? \to f_{\frac{i+2}{2}} \to f_{\frac{i}{2}} \to f_{i} ?f2i+2f2ifi 更优,总代价是 y + x y+x y+x

所以 i i i 为偶数的转移方程是 f i = min ⁡ { f i − 1 + x , f i 2 + y } f_{i}=\min\{f_{i-1}+x,f_{\frac{i}{2}}+y\} fi=min{fi1+x,f2i+y}


i i i 为奇数:

i i i 为奇数时 f i f_i fi 能从 f i − 1 , f i + 1 f_{i-1},f_{i+1} fi1,fi+1 转移过来,接下来讨论 f i + 1 f_{i+1} fi+1 的转移思路。

显然 f i + 1 f_{i+1} fi+1 不能从 f i f_{i} fi 转移,于是只能从 f i + 2 , f i + 1 2 f_{i+2},f_{\frac{i+1}{2}} fi+2,f2i+1 转移,发现 f i + 2 f_{i+2} fi+2 又是个奇数,因此如果从 f i + 2 f_{i+2} fi+2 转移的话路径只能是这样:

? → f i + 1 2 → f i + 3 2 → f i + 3 → f i + 2 → f i + 1 → f i ? \to f_{\frac{i+1}{2}} \to f_{\frac{i+3}{2}} \to f_{i+3} \to f_{i+2} \to f_{i+1} \to f_{i} ?f2i+1f2i+3fi+3fi+2fi+1fi

总代价是 4 x + y 4x+y 4x+y,显然不如从 f i + 1 f_{i+1} fi+1 的转移路径 ? → f i + 1 2 → f i + 1 → f i ? \to f_{\frac{i+1}{2}} \to f_{i+1} \to f_{i} ?f2i+1fi+1fi,总代价是 y + x y+x y+x

所以 i i i 为奇数的转移方程是 f i = min ⁡ { f i − 1 + x , f i + 1 2 + x + y } f_{i}=\min\{f_{i-1}+x,f_{\frac{i+1}{2}}+x+y\} fi=min{fi1+x,f2i+1+x+y}


所以最后的方程就是上面两个式子综合一下就好了。

Code:GitHub CodeBase-of-Plozia CF710E Generate a String.cpp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值