zoukankan      html  css  js  c++  java
  • loj10172

    涂抹果酱

    Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕。蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵)。蛋糕很快做好了,但光秃秃的蛋糕肯定不好看!所以,Sam 要在蛋糕的上表面涂抹果酱。果酱有三种,分别是红果酱、绿果酱、蓝果酱,三种果酱的编号分别为 1,2,31,2,31,2,3。为了保证蛋糕的视觉效果,Admin 下达了死命令:相邻的区域严禁使用同种果酱。但 Sam 在接到这条命令之前,已经涂好了蛋糕第 KKK 行的果酱,且无法修改。
    现在 Sam 想知道:能令 Admin 满意的涂果酱方案有多少种。请输出方案数 mod106。若不存在满足条件的方案,请输出 000。

    ------------------------------------------------------------------------------------------------------------------------------

    状态压缩动态规划

    三进制状态压缩,转移方程式很简单,问题只是处在三进制的处理!

    ------------------------------------------------------------------------------------------------------------------------------

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int nn,n,m,k,sk;
     5 long long f[10010][1<<5+5];
     6 int st[1<<5+5],js;
     7 int maxm=1;
     8 
     9 void getst()
    10 {
    11     for(int i=0;i<m;++i)maxm*=3;
    12     for(int ii=0;ii<maxm;++ii)
    13     {
    14         int i=ii,bz=1;
    15         int pre=-1;
    16         for(int cur,j=0;j<m;++j)
    17         {
    18             cur=i%3;
    19             if(cur==pre){
    20                 bz=0;
    21                 break;
    22             }
    23             pre=cur;
    24             i/=3;
    25         }
    26         if(bz)st[js++]=ii;
    27     }
    28 }
    29 bool bj(int x,int y)
    30 {
    31     x=st[x];y=st[y];
    32     for(int i=0;i<m;++i)
    33     {
    34         int xx=x%3,yy=y%3;
    35         if(xx==yy)return 0;
    36         x/=3;y/=3;
    37     }
    38     return 1;
    39 }
    40 void dp()
    41 {
    42     for(int i=0;i<js;++i)f[1][st[i]]=1;
    43     for(int i=2;i<=nn;++i)
    44     {
    45         for(int s=0;s<js;++s)
    46         {
    47             for(int ss=0;ss<js;++ss)
    48                 if(bj(ss,s))f[i][st[s]]=(f[i][st[s]]+f[i-1][st[ss]])%1000000;
    49         }
    50     }
    51 }
    52 int main()
    53 {
    54     scanf("%d%d%d",&n,&m,&k);
    55     for(int tp,i=0;i<m;++i)
    56     {
    57         scanf("%d",&tp);tp--;
    58         sk=sk*3+tp;
    59     }
    60     getst();
    61     nn=max(k,n-k+1);
    62     dp();
    63     cout<<f[k][sk]*f[n-k+1][sk]%1000000;
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    PCLVisualizer::addSphere 运行报错解决方案
    八叉树 (转载)
    Django 迁移错误 Cannot add foreign key constraint,字段类型自动变成Bigint(20)
    Django之Model字段详解
    FineReport如何连接hadoop,hive,Impala数据库,Kerberos认证
    图片自适应容器的几种方法
    【windows】查看电池使用情况
    【C++】C++复合变量的定义及易错点
    【c++】C++自定义类注意事项
    金字塔池化Spatial Pyramid Pooling
  • 原文地址:https://www.cnblogs.com/gryzy/p/9832580.html
Copyright © 2011-2022 走看看