• 钥匙计数之一


    分析:首先想到每个钥匙的结尾有4种状态,不过题目还需要判断有三种不同的钥匙深度,所以每种深度结尾后有2^4种状态,0000->1111,不过题目还需需要有相邻的钥匙深度大于等于3,所以需要两种不同的状态表示0表示没有出现过这样的,1表示出现过,然后开一个4维的数组进行状态转移就好了dp[MAXN][bit][1<<bit][2]。

    代码如下:

    ============================================================================================================================

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    
    const int MAXN = 32;
    const int bit = 4;
    
    long long dp[MAXN][bit][1<<bit][2];
    
    int main()
    {
        dp[1][0][1][0] = dp[1][1][2][0] = 1;
        dp[1][2][4][0] = dp[1][3][8][0] = 1;
    
        for(int i=1; i<MAXN; i++)
        for(int j=0; j<bit; j++)
        for(int k=0; k<(1<<bit); k++)
        {
            if(dp[i][j][k][0])
            {
                for(int t=0; t<4; t++)
                {
                    if(abs(j-t) == 3)
                        dp[i+1][t][k|(1<<t)][1] += dp[i][j][k][0];
                    else
                        dp[i+1][t][k|(1<<t)][0] += dp[i][j][k][0];
                }
            }
            if(dp[i][j][k][1])
            {
                for(int t=0; t<4; t++)
                    dp[i+1][t][k|(1<<t)][1] += dp[i][j][k][1];
            }
        }
    
        long long sum[MAXN]={0};
    
        for(int i=3; i<MAXN; i++)
        for(int j=0; j<bit; j++)
        for(int k=7; k<16; k++)
        {
            if(k==7||k==11||k>=13)
                sum[i] += dp[i][j][k][1];
        }
    
        for(int i=2; i<MAXN; i++)
        {
            printf("N=%d: %lld
    ", i, sum[i]);
        }
    
        return 0;
    }
  • 相关阅读:
    Debian双网卡配置
    Linux服务器双网卡双IP和单网卡双IP配置方法(Debian/Ubuntu)
    Debian系列网卡配置详解
    Debian下配置IPV6和静态路由
    Ubuntu Server系统修改IP地址
    Centos7新增静态路由
    Debian添加静态路由的正确姿势
    Linux 更改时区、时间
    Apache 2.4自签名证书及客户端SSL认证
    【计划】
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4849651.html
Copyright © 2020-2023  润新知