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;
    }
  • 相关阅读:
    Python try/except/finally
    EmailMessage类
    HTML DOM 初学笔记
    JavaScript 初学备忘录
    html style标签
    Django 导出csv文件 中文乱码问题
    Html 列表实现展开和收起
    Django CreateView 简单使用
    Django用户认证
    Nginx负载均衡配置实例详解
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4849651.html
Copyright © 2011-2022 走看看