Luogu P1879 玉米田 题解报告

刷水题找自信系列

题目传送门

【题目大意】

有一个$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 }

代码戳这里

原文地址:https://www.cnblogs.com/THWZF/p/11741787.html

时间: 2024-08-02 01:37:33

Luogu P1879 玉米田 题解报告的相关文章

【Luogu】P1879玉米田(状压DP)

题目链接 数据范围这么小,难度又这么大,一般就是状态压缩DP了. 对输入进行处理,二进制表示每一行的草地状况.如111表示这一行草地肥沃,压缩成7. 所以f[i][j]表示第i行状态为j时的方案数 状态j指的是一个二进制集合,有牛在吃草的位置是1,不再吃草的位置是0 f[i][j]=Sum(f[i-1][k]) 限制:(1) j必须是草地状况的子集.很好理解,如果有牛在贫瘠草地上吃草--会被投诉到动物保护协会的 (2) j 的相邻两个位置不能都是1. 代码表示为!(j&(j<<1) (

洛谷P1879 玉米田

题目描述 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的奶牛们享用. 遗憾的是,有些土地相当贫瘠,不能用来种草.并且,奶牛们喜欢独占一块草地的感觉,于是John不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边. John想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择?(当然,把新牧场完全荒废也是一种方案) 输入输出格式 输

Luogu P4204 神奇口袋 题解报告

题目传送门 [题目大意] 一个口袋里装了t种颜色的球,第i种颜色的球的数目为ai,每次随机抽一个小球,然后再放d个这种颜色的小球进口袋. 给出n个要求,第x个抽出的球颜色为y,求满足条件的概率. [思路分析] 抽出一个球颜色为i的概率设为f[i],球的总数为sum 在第k步时,$f[i]=\frac{a[i]}{sum}$ 那么在k+1步就有两种情况: 1.第k步抽中了颜色为i的球,那么此时概率为$\frac{a[i]}{sum}*\frac{a[i]+d}{sum+d}$ 2.第k步没有抽中,

Luogu P2657 windy数 题解报告

题目传送门 [题目大意] 定义不含前导零且相邻两个数字之差至少为2的数为$windy$数,求在$[A,B]$这个区间内存在多少$windy$数. [思路分析] 好的据说这是一道数位DP板子题……$mark$一下,不过说实话这题难道不是记忆化搜索吗???QAQ 我们首先把问题转化成求$[1,B]$之间的$windy$数减去$[1,A-1]$之间的$windy$数,然后单独考虑. 设$f[i][j]$表示到第$i$位,前一位数字为$j$的方案数.然后我们为了保证数字不超出范围,要加一个变量记录是否有

Luogu P1613 跑路 题解报告

题目传送门 [题目大意] [思路分析] 我们设$g[i][j][k]$表示从$i$走$2^k$步能否到达$j$,$d[i][j]$表示$i$到$j$最少要走多少秒. 用倍增预处理出$g$,然后就可以$Floyd$跑最短路啦!QwQ [代码实现] 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6

洛谷 P1879 [USACO06NOV]玉米田Corn Fields

P1879 [USACO06NOV]玉米田Corn Fields 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the

P1879 [USACO06NOV]玉米田Corn Fields

P1879 [USACO06NOV]玉米田Corn Fields 这道题跟互不侵犯差不多,但是数据范围更大了 对于状态压缩dp,提前枚举出转移是一种很好的优化 然后对于转移也需要仔仔细细的分析,如同期望dp #include<cstdio> #include<algorithm> #include<iostream> const int mod=1e8; int map[20]; long long f[2][1<<12]; int b[400],tot;

3594: [Scoi2014]方伯伯的玉米田

3594: [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,把这个区间的玉米全部拔高1单位高度,他可以进行最多K次这样的操作.拔玉米则可以随意选择一个集合的玉米拔掉.问能最多剩多少株玉米,来构成一排美丽的玉米. Input 第1行包含

玉米田(状压DP)

题目:P1879 [USACO06NOV]玉米田Corn Fields 参考:状态压缩动态规划 状压DP 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的奶牛们享用. 遗憾的是,有些土地相当贫瘠,不能用来种草.并且,奶牛们喜欢独占一块草地的感觉,于是John不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边. John想知道,如果不考虑草地的总块数