zoukankan      html  css  js  c++  java
  • 【P2476】着色方案(记忆化搜索+特殊的DP数组)

    这个题代码难度几乎为0,然而思维难度对于蒟蒻来说简直是突破天际啊!首先我思考的是这个油漆的种类只有15种,是不是可以像一道叫做8数码难题的东西暴力15维数组呢。。计算发现不可以。。。。空间会直接让你学会做人,然后就是看到每种油漆最多有5桶,所以自然想到把这几桶分别有几种油漆作为状态转移,然后,蒟蒻就没有继续下去的思路了。。点开题解先看到这题与王八棋那道题的思路类似所以回忆了一下,有了一个大概的思路,就是按照这个方案记忆化搜索,然后根据乘法原理,直接乘上刚刚搜到的就可以了。没想到的是,一遍就过了。。。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #define re register
    #define mo 1000000007
    #define dp f[a][b][c][d][e][l]
    using namespace std;
    long long al[6],f[16][16][16][16][16][6],c,n,d,ans;
    inline long long dfs(int a,int b,int c,int d,int e,int l)
    {
        if(dp)
        return dp;
        if(a+b+c+d+e==0)
        return 1;
        if(a){dp+=(a-(l==2))*dfs(a-1,b,c,d,e,1);}
        if(b){dp+=(b-(l==3))*dfs(a+1,b-1,c,d,e,2);}
        if(c){dp+=(c-(l==4))*dfs(a,b+1,c-1,d,e,3);}
        if(d){dp+=(d-(l==5))*dfs(a,b,c+1,d-1,e,4);}
        if(e){dp+=e*dfs(a,b,c,d+1,e-1,5)%mo;}
        dp%=mo;
        return dp;
    }
    int main()
    {
        cin>>c;
        for(re int i=1;i<=c;i++)
        {
            cin>>d;
            al[d]++;
        }
        ans=dfs(al[1],al[2],al[3],al[4],al[5],0)%mo;
        cout<<ans;
    }
  • 相关阅读:
    MySQL数据库与表的增删改查
    JavaScript相关基础知识点
    用jquery制作一个二级导航下拉菜单
    jQuery如何获取元素及选择器的参考
    Trapping Rain Water
    First Missing Positive
    Combination Sum II
    Combination Sum
    vector的几小点
    C中字符结尾‘’的作用
  • 原文地址:https://www.cnblogs.com/victorique/p/8426796.html
Copyright © 2011-2022 走看看