每日一题 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 }
请各位大佬斧正(反正我不认识斧正是什么意思)