洛谷P1879 [USACO06NOV]玉米田Corn Fields【状压dp】
P1879 [USACO06NOV]玉米田Corn Fields
時(shí)間限制 1.00s
內(nèi)存限制 125.00MB
題目描述
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 squares are infertile and can’t be planted. Canny FJ knows that the cows dislike eating close to each other, so when choosing which squares to plant, he avoids choosing squares that are adjacent; no two chosen squares share an edge. He has not yet made the final choice as to which squares to plant.
Being a very open-minded man, Farmer John wants to consider all possible options for how to choose the squares for planting. He is so open-minded that he considers choosing no squares as a valid option! Please help Farmer John determine the number of ways he can choose the squares to plant.
農(nóng)場主John新買了一塊長方形的新牧場,這塊牧場被劃分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一塊正方形的土地。John打算在牧場上的某幾格里種上美味的草,供他的奶牛們享用。
遺憾的是,有些土地相當(dāng)貧瘠,不能用來種草。并且,奶牛們喜歡獨(dú)占一塊草地的感覺,于是John不會(huì)選擇兩塊相鄰的土地,也就是說,沒有哪兩塊草地有公共邊。
John想知道,如果不考慮草地的總塊數(shù),那么,一共有多少種種植方案可供他選擇?(當(dāng)然,把新牧場完全荒廢也是一種方案)
輸入格式
第一行:兩個(gè)整數(shù)M和N,用空格隔開。
第2到第M+1行:每行包含N個(gè)用空格隔開的整數(shù),描述了每塊土地的狀態(tài)。第i+1行描述了第i行的土地,所有整數(shù)均為0或1,是1的話,表示這塊土地足夠肥沃,0則表示這塊土地不適合種草。
輸出格式
一個(gè)整數(shù),即牧場分配總方案數(shù)除以100,000,000的余數(shù)。
輸入輸出樣例
輸入 #1 復(fù)制
2 3
1 1 1
0 1 0
輸出 #1 復(fù)制
9
解題思路:
假設(shè)dp[i][j]dp[i][j]dp[i][j]為第iii行在jjj狀態(tài)下前iii行的方案數(shù),因此,對(duì)于此題,我們只需要遍歷一下每行的狀態(tài)(對(duì)于每行,我們將一行的種植情況放在一起作為一個(gè)二進(jìn)制數(shù),用十進(jìn)制存儲(chǔ),對(duì)于每行的狀態(tài),用1表示該塊種草,0表示不種),即從0 ~ ((1<<m)-1)遍歷每行的狀態(tài),同時(shí)在遍歷的過程中判斷狀態(tài)是否合法,即狀態(tài)是否在不能種草的地方種了草,即對(duì)應(yīng)位狀態(tài)上為1而初始要求為0,并將合法的狀態(tài)存到動(dòng)態(tài)數(shù)組中保存起來,從第二行開始,每行的狀態(tài)還需考慮前一行的情況,要求其在對(duì)應(yīng)位不能同時(shí)為1,即當(dāng)前狀態(tài)與前一行狀態(tài)取與后結(jié)果為0,因此就可以寫出動(dòng)態(tài)轉(zhuǎn)移方程
dp[h][sta]=(dp[h][sta]+dp[h?1][arr[h?1][i]])%moddp[h][sta]=(dp[h][sta]+dp[h-1][arr[h-1][i]])\%moddp[h][sta]=(dp[h][sta]+dp[h?1][arr[h?1][i]])%mod
sta為當(dāng)前hhh行的狀態(tài),dp[h?1][arr[h?1][i]]dp[h-1][arr[h-1][i]]dp[h?1][arr[h?1][i]]為遍歷的前一行的狀態(tài)。
代碼:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <cstdlib> #include <cstring> #include <map> #include <stack> #include <queue> #include <vector> #include <bitset> #include <set> #include <utility> #include <sstream> #include <iomanip> using namespace std; typedef long long ll; typedef unsigned long long ull; #define inf 0x3f3f3f3f #define rep(i,l,r) for(int i=l;i<=r;i++) #define lep(i,l,r) for(int i=l;i>=r;i--) #define ms(arr) memset(arr,0,sizeof(arr)) //priority_queue<int,vector<int> ,greater<int> >q; const int maxn = (int)1e5 + 5; const ll mod = 1e8; ll dp[20][8000]; ll ans; int a[20][20]; vector<int> arr[20]; int n,m; bool ju1(int sta,int h) {for(int i=1;i<=m;i++) {if(a[h][i]==0&&(sta&(1<<(i-1)))==(1<<(i-1))) {return false;}}return true; } int num[20]; bool ju2(int sta) {ms(num);int id=0;while(sta) {num[++id]=(sta&1);sta>>=1;}for(int i=1;i<id;i++) {if(num[i]==1&&num[i+1]==1) {return false;}}return true; } void fun(int sta,int h) {for(int i=0;i<arr[h-1].size();i++) {if((sta&arr[h-1][i])==0) {dp[h][sta]=(dp[h][sta]+dp[h-1][arr[h-1][i]])%mod;//cout<<dp[h][sta]<<endl;}} } int main() {#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endif//freopen("out.txt", "w", stdout);//ios::sync_with_stdio(0),cin.tie(0);scanf("%d %d",&n,&m);rep(i,1,n) {rep(j,1,m) {scanf("%d",&a[i][j]);}}for(int i=0;i<(1<<m);i++) {if(ju1(i,1)&&ju2(i)) {arr[1].push_back(i);dp[1][i]=1;}if(n==1) {ans=(ans+dp[1][i])%mod;}}for(int i=2;i<=n;i++) {for(int j=0;j<(1<<m);j++) {if(ju1(j,i)&&ju2(j)) {fun(j,i);arr[i].push_back(j);}if(i==n) {ans=(ans+dp[i][j])%mod;//cout<<ans<<endl;}}}/*for(int i=1;i<=n;i++) {for(int j=0;j<(1<<m);j++) {cout<<dp[i][j]<<" ";}cout<<endl;}*/printf("%lld\n",ans);return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的洛谷P1879 [USACO06NOV]玉米田Corn Fields【状压dp】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 问题 B: 调整表中元素顺序(线性表)
- 下一篇: 【动态规划】0/1背包问题