LOJ P10171 牧场的安排 题解

每日一题 day6 打卡

Analysis

状压dp

dp[i][j]+=dp[i-1][k];

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #define maxn 5000+10
 7 #define mod 100000000
 8 using namespace std;
 9 inline int read() 
10 {
11     int x=0;
12     bool f=1;
13     char c=getchar();
14     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
15     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
16     if(f) return x;
17     return 0-x;
18 }
19 inline void write(int x)
20 {
21     if(x<0){putchar('-');x=-x;}
22     if(x>9)write(x/10);
23     putchar(x%10+'0');
24 }
25 int m,n;
26 int t,x,cnt=0;
27 int de[20][maxn],num[20];
28 long long dp[20][maxn],ans;
29 inline void count(int a)
30 {
31     cnt=0;
32     for(int i=0;i<(1<<n);i++)
33     {
34         if((i&(i<<1))||(i&(i>>1))||(i&t)) continue;
35         de[a][++cnt]=i;
36     }
37     num[a]=cnt;
38 }
39 int main()
40 {
41     memset(dp,0,sizeof(dp));
42     m=read();n=read();
43     for(int i=1;i<=m;i++)
44     {
45         t=0;
46         for(int j=1;j<=n;j++)
47         {
48             x=read();
49             t=(t<<1)+1-x;
50         }
51         count(i);
52     }
53     for(int i=1;i<=num[1];i++) dp[1][i]=1;
54     for(int i=2;i<=m;i++)
55     {
56         for(int j=1;j<=num[i];j++)
57         {
58             for(int k=1;k<=num[i-1];k++)
59             {
60                 if(de[i][j]&de[i-1][k]) continue;
61                 dp[i][j]+=dp[i-1][k];
62             }
63         }
64     }
65     for(int i=1;i<=num[m];i++)
66     {
67         ans+=dp[m][i];
68         ans%=mod;
69     }
70     write(ans);
71     return 0;
72 }

请各位大佬斧正(反正我不认识斧正是什么意思)

posted @ 2019-09-05 18:06  handsome_zyc  阅读(225)  评论(0编辑  收藏  举报