Codeforces Good bye 2016
此题由于状态转移思路花了很久才弄明白,认为实在有必要记录下
题解链接:http://codeforces.com/blog/entry/49412
官网评论的思路说的很明白:
感想:这种转化为自动状态机的做题思路,实在可叹,可取。这才符合计算机专业的思维。动态规划的本质就是建立在这种状态的转移上,DP的思维就应该以状态机的方式去思考。
收获&思路:从数据范围来看一串digital number,长度最多到2e5,完全区间dp的话n^2的复杂度不可取,必须用线段树去维护区间,达到log级别的查询。但最核心的是,区间dp中的状态转移方程是什么。如上图,首先看达到2017这个子串,状态机是如何从没有最开始的没有2到最后的加上7这个状态转移的。我们设置m[5][5]维护的是当前这个区间,其中m[i][j]指的是从状态i到j需要删掉多少字符才能达到。这里的状态都是上图那个状态机的状态。那如何合并两个区间呢,两个区间中的m[i][j]可以由min(m[i][k]+m[k][j]) 其中k<=j,j>=i,比如某个区间从0到4状态要删掉多少字符,可以由某两个子区间从状态0到2,另一个从2到4转移得到,或者就是左子区间保持状态0要删的数加上右子区间从状态0到4要删的数。一个区间的从0到4的状态必须从左右子区间的这种状态转移得到,没有例外。所以可以动态规划。
他人代码链接:
https://www.cnblogs.com/heimao5027/p/6428216.html(代码好理解)