bzoj2958序列染色

暴风城传送门

总结

这题因为一开始使用了不方便的状态,所以调了很久。网上大部分题解都是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-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值