zoukankan      html  css  js  c++  java
  • CF D Bicolorings

    题意

    给一个2行n列的矩阵填上黑色和白色,求连通块个数为k个的填色方案数量(mod 998244353)
     
    因为只有两行,为n-1列的矩阵增加1列的情况数只有很少,容易想到用 (i,k) 表示 i 列有 k个连通块的矩阵, 但是它在向 i+1 列的矩阵转移时,需要知道最后一列的状态,所以可以用 0, 1, 23表示最后一列为 00, 01, 10,11状态就增加一维变成 (i,k,s),然后就是分析递推关系:
     
     
    (i,k,0) 的矩阵,可以由i−1 列的矩阵添加一列 00 得到,当它的结尾为 00, 01, 10, 11时,分别会让连通块个数:不变,不变,不变,+1,所以 (i,k,0)由 (i1,k,0)(i1,k,1)(i1,k,2)(i1,k1,3)
     
     
    dp[i][k][0]=(dp[i-1][k][0]+dp[i-1][k][1]+dp[i-1][k][2]+dp[i-1][k-1][3])%mod;
     
    (i,k,1)的矩阵同理,为i−1列的矩阵添加 01,当结尾为 00,01, 10, 11时,分别会使连通块的个数:+1,不变,+2,+1,所以(i,k,1)(i−1,k−1,0),(i1,k,1),(i−1,k−2,2),(i−1,k−1,3)得到:
    dp[i][k][1]=(dp[i-1][k-1][0]+dp[i-1][k][1]+dp[i-1][k-2][2]+dp[i-1][k-1][3])%mod;
    其他同理:

    dp[i][k][2]=(dp[i-1][k-1][0]+dp[i-1][k-2][1]+dp[i-1][k][2]+dp[i-1][k-1][3])%mod;
    dp[i][k][3]=(dp[i-1][k-1][0]+dp[i-1][k][1]+dp[i-1][k][2]+dp[i-1][k][3])%mod;

    很容易得出初始化:

    dp[1][2][2]=1;
    dp[1][2][1]=1;
    dp[1][1][0]=1;
    dp[1][1][3]=1;

    答案:

    long long ans=0;
    for(int i=0 ; i<4 ; i++)
    ans=(ans+dp[n][m][i])%mod;
    printf("%I64d ",ans);

    #include<bits/stdc++.h>
    
    using namespace std ;
    
    const int mod = 998244353 ;
    
    long long  dp[1001][2001][5];
    
    int main( )
    {
        int n,m;
        scanf("%d%d",&n,&m);
        dp[1][2][2]=1;
        dp[1][2][1]=1;
        dp[1][1][0]=1;
        dp[1][1][3]=1;
        for(int i=2 ; i<=n ; i++)
        {
            for(int k=1 ; k<=min(2*i,m) ; k++)
            {
                dp[i][k][0]=(dp[i-1][k][0]+dp[i-1][k][1]+dp[i-1][k][2]+dp[i-1][k-1][3])%mod;
                dp[i][k][1]=(dp[i-1][k-1][0]+dp[i-1][k][1]+dp[i-1][k-2][2]+dp[i-1][k-1][3])%mod;
                dp[i][k][2]=(dp[i-1][k-1][0]+dp[i-1][k-2][1]+dp[i-1][k][2]+dp[i-1][k-1][3])%mod;
                dp[i][k][3]=(dp[i-1][k-1][0]+dp[i-1][k][1]+dp[i-1][k][2]+dp[i-1][k][3])%mod;
            }
        }
        long long  ans=0;
        for(int i=0 ; i<4 ; i++)
        ans=(ans+dp[n][m][i])%mod;
        printf("%I64d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    fork()和vfork()的区别(转载)
    Linux中fork()函数详解(转载)
    ERROR:Simulator861-Failed to link the design解决办法
    ISE 14.7安装教程最新版(Win10安装)
    实验2用户及文件权限管理
    检验
    实验1基本概念及操作
    日常学习笔记(2)
    日常笔记1
    拷贝初始化的几种情况
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/9699158.html
Copyright © 2011-2022 走看看