bzoj2958序列染色

博客作者分享了在解决bzoj2958题目时遇到的问题和解决过程,主要讨论了如何处理序列染色的状态转移。作者最初使用f[i][j]表示填到第i个位置的不同状态数,但遇到了算重问题。通过将特定连续的111作为固定组合,简化了问题。尽管计算过程中仍有重复,作者发现了一种修正方法,即f'[i][1] = f[i][1] - f[i][2],f[i][0] = f[i][0] - f[i][1] - f[i][2],以排除重复计数。博客包含作者的解题代码。
摘要由CSDN通过智能技术生成
暴风城传送门

总结

这题因为一开始使用了不方便的状态,所以调了很久。网上大部分题解都是f[i][j][k]为状态的,但我是只用了f[i][j],所以迷操了很久。

f[i][j][k]的状态和转移比较简单,而且我没有分析过,所以这里就不写了,具体看别人的总结就好。

然后我说一下我的方法。下面B用1表示,W用2表示。

f[i][j]表示填到第i个其中状态是j(j=0,1,2分别表示三种状态)的数量。

首先一开始我没有考虑11111(k=3)中到底是前111是一组还是中间111一组还是后面111是一组。所以一开始就卡了很久。
然后我决定把最后的111定成贡献,那么问题就变成a

    for (int i=1;i<=n;i++) {
        if (a[i]!=3) {
            f[i][0]=(f[i-1][0]+f[i][0])%Mod;
            f[i][1]=(f[i-1][1]+f[i][1])%Mod;
            f[i][2]=(f[i-1][2]+f[i][2])%Mod;
        } else {
            f[i][0]=((f[i-1][0]+f[i-1][0])%Mod+f[i][0])%Mod;
            f[i][1]=((f[i-1][1]+f[i-1][1])%Mod+f[i][1])%Mod;
            f[i][2]=((f[i-1][2]+f[i-1][2])%Mod+f[i][2])%Mod;
        }
        if (i+k-1<=n) {
            int j=i+k-1;
            if (s2[j]-s2[i-1]==0&&a[j+1]!=1) {
                f[j+1][1]=(f[i-1][0]+f[j+1][1])%Mod;
                int ni=j+1,nj=ni+k-1;
                if (s1[nj]-s1[ni-1]==0&&a[nj+1]!=2) {
                    if (nj+1<=n) f[nj+1][2]=(f[i-1][0]+f[nj+1][2])%Mod;
                    else f[nj][2]=(f[i-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值