牛牛的回文串(预处理 + 区间DP)

题目链接

题意:

牛牛喜欢回文串,牛妹给了牛牛一个字符串S,牛牛想把S变成回文串
牛牛可以做如下三种操作
1:在任意位置增加一个字符
2:删除一个字符
3:改变一个字符

每种操作都有限定的字符,比如,只能删除’a’,增加’b’,把’c’变成’d’等等
每种操作都有相应的代价
用M条语句来描述能进行的操作
add c x 表示增加c字符需要x的代价
erase c x表示删除c字符需要x的代价
change c1 c2 x表示将c1 改成c2需要x的代价
求牛牛想要得到回文串需要的最少代价
如果不行输出-1
串的长度<=50

题解:

dp(i,j)表示把[i, j]这一区间变成回文串的最小代价,那么dp(i, j)可以由dp(i+1, j), dp(i, j-1), dp(i+1, j-1)这三种状态转移而来。
但是因为它给出的操作可以出现很多变换,直接进行它所给的操作有可能不会得到最优解:比如change(a,c) = 10,add( a ) = 1,add( c ) = 100,那么直接add( c )的代价要比先add( a )再change(a,c)要大,而change之间也类似。所以我们用类似最短路的算法预处理出所有类型操作的最小费用(代价为inf = 不能进行该操作)。
预处理完之后,对于区间(i, j),它可能的转移:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值