ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Luogu P1879 玉米田 题解报告

2019-10-26 09:02:25  阅读:322  来源: 互联网

标签:cnt ch 题解 玉米田 种草 ans Luogu mod define


刷水题找自信系列

题目传送门

【题目大意】

有一个$n*m$的矩阵,每个格子为一块土地,我们可以在土地上种草。每块土地有一个值,如果为$0$,则这块土地很贫瘠,不能种草;如果为$1$,则这块土地很肥沃,可以种草。现在要在这个矩阵上种草,要求不能有两个相邻的格子都种了草,求方案数。

【思路分析】

因为$n,m\ge12$,所以我们考虑状压。设$f[i][j]$表示第$i$行状态为$j$时的方案数,对于状态$j$要判断是否合法,即判断是否符合土地的贫瘠和肥沃的性质,以及同一行内是否有相邻的格子种了草。然后枚举上一行的状态$k$,如果没有上下两个相邻的格子种了草,则$f[i][j]+=f[i-1][k]$

初始值为$f[1][i]=1$,保证状态$i$合法。答案为$\sum f[n][j]$,保证状态$j$合法。

【代码实现】

 1 #include<bits/stdc++.h>
 2 #define ri register int
 3 #define ll long long
 4 #define rl register ll
 5 #define go(i,a,b) for(ri i=a;i<=b;i++)
 6 #define back(i,a,b) for(ri i=a;i>=b;i--)
 7 #define g() getchar()
 8 #define il inline
 9 #define pf printf
10 using namespace std;
11 il int fr(){
12     ri w=0,q=1;char ch=g();
13     while(ch<'0'||ch>'9'){if(ch=='-')q=-1;ch=g();}
14     while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+ch-'0',ch=g();
15     return w*q;
16 }
17 const int mod=1e9;
18 int n,m,f[15][1<<12],s[15],ans;
19 int main(){
20     //freopen(".in","r",stdin);
21     //freopen(".out","w",stdout);
22     n=fr();m=fr();
23     go(i,1,n)go(j,1,m){
24         ri x=fr();
25         if(x)s[i]|=1<<(m-j);
26     }
27     go(i,1,n)go(j,0,(1<<m)-1){
28         if(((j<<1)&j)||((j>>1)&j))continue;
29         bool cnt=0;
30         go(k,0,m-1)if(((j>>k)&1)&&(!((s[i]>>k)&1))){cnt=1;break;}
31         if(cnt)continue;
32         if(i==1)f[i][j]=1;
33         else
34             go(k,0,(1<<m)-1){
35                 cnt=0;
36                 go(t,0,m-1)if((j>>t)&(k>>t)){cnt=1;break;}
37                 if(cnt)continue;
38                 f[i][j]+=f[i-1][k];if(f[i][j]>=mod)f[i][j]-=mod;
39             }
40         if(i==n){ans+=f[i][j];if(ans>=mod)ans-=mod;}
41     }
42     pf("%d\n",ans);
43     return 0;
44 }
代码戳这里

 

标签:cnt,ch,题解,玉米田,种草,ans,Luogu,mod,define
来源: https://www.cnblogs.com/THWZF/p/11741787.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有