狀壓DP入門NO.1洛谷 P1879玉米地
阿新 • • 發佈:2018-09-22
入門 map namespace 記錄 方便 def 沖突 https i++
題目鏈接:https://www.luogu.org/problemnew/lists?name=1879
Code:
//2018-09-17 提高+ //狀壓dp #include<iostream> #include<cstdio> #define mod 100000000 using namespace std; long long n,m,ans; int map[13][13]; long long f[1<<12][13]; int y[13],sign[1<<12]; int main() { scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&map[i][j]); //記錄土地情況 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) y[i]=(y[i]<<1)+map[i][j]; //合並土地情況 //方便後面判斷 //枚舉每一種狀態 //預處理左右不行的狀態for(int i=0;i<(1<<m);i++) { if(!(i&(i<<1)) && !(i&(i>>1))) { sign[i]=1; //標記 if((i&y[1]) == i) f[i][1]=1; //如果這種狀態符合土地條件 //初始化f數組 } } for(int i=2;i<=n;i++)//枚舉每一行 for(int j=0;j<(1<<m);j++) //枚舉上一行的狀態 if(((j&y[i-1])==j) && sign[j]) //如果土地肥沃,且當前狀態左右不沖突 for(int k=0;k<(1<<m);k++) //枚舉這一行的狀態 if(((k&y[i])==k)&&!(j&k)&&sign[k]) f[k][i]=(f[k][i]+f[j][i-1])%mod; //當前行的狀態只會收上一行的影響 for(int i=0;i<(1<<m);i++) ans=(ans+f[i][n])%mod; //記錄答案 cout<<ans; return 0; } //By Yfengzi
狀壓DP入門NO.1洛谷 P1879玉米地