zoukankan      html  css  js  c++  java
  • 钥匙计数之一

    分析:首先想到每个钥匙的结尾有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;
    }
  • 相关阅读:
    webpack学习_管理输出(管理资源插件)
    vue路由
    vue动态组件,组件缓存
    vue组件间传参
    模块化
    安装Vue脚手架,创建Vue项目
    Vue常用指令
    VUE概述
    小程序调用微信支付接口
    Android音视频开发之-WebRTC技术实践
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4849651.html
Copyright © 2011-2022 走看看