描述
農民 john 購買了一處肥沃的矩形牧場,分成m*n(1 <= m <= 12; 1 <= n <= 12)個 格仔。他想在那裡的一些格仔中種植美味的玉公尺。遺憾的是,有些格仔區域的土地是貧瘠的, 不能耕種。 精明的 fj 知道奶牛們進食時不喜歡和別的牛相鄰,所以一旦在乙個格仔中種植玉公尺,那麼 他就不會在相鄰的格仔中種植,即沒有兩個被選中的格仔擁有公共邊。他還沒有最終確定哪些 格仔要選擇種植玉公尺。
作為乙個思想開明的人,農民 john 希望考慮所有可行的選擇格仔種植方案。由於太開明, 他還考慮乙個格仔都不選擇的種植方案!請幫助農民 john 確定種植方案總數。
輸入line 1: 兩個用空格分隔的整數 m 和 n
lines 2…m+1: 第 i+1 行描述牧場第i行每個格仔的情況, n 個用空格分隔的整數,表示 這個格仔是否可以種植(1 表示肥沃的、適合種植,0 表示貧瘠的、不可種植)
輸出line 1: 乙個整數: fj 可選擇的方案總數 除以 100,000,000 的餘數。
樣例輸入
2 31 1 1
0 1 0
樣例輸出
提示給可以種植玉公尺的格仔編號:
1 2 3 4
只種乙個格仔的方案有四種 (1, 2, 3, 或 4),種植兩個格仔的方案有三種 (13, 14, 或 34),種植三個格仔的方案有一種 (134),還有一種什麼格仔都不種。 4+3+1+1=9。
標籤usaco2007nov glod
簡單狀壓dp。
直接預處理出所有合法情況。
f [i
][j]
f[i][j]
f[i][j
]表示前i行,第i行狀態為sta
[[j]
sta[[j]
sta[[j
]
#include
#define n 20
#define mod 100000000
using
namespace std;
int n,m,sta[
4005
],ban[n]
,tot=
0,f[n]
[4005
],ans=0;
intmain()
for(
int i=
1;i<=tot;
++i)if(
(sta[i]
|ban[1]
)==ban[1]
)f[1
][i]=1
;for
(int i=
2;i<=n;
++i)}}
for(
int i=
1;i<=tot;
++i)
(ans+
=f[n]
[i])
%=mod;
cout
}
牧場的安排(狀壓dp)
說明備註 題目思路 farmerjohn新買了一塊長方形的牧場,這塊牧場被劃分成m行n列 1 m 12 1 n 12 每一格都是一塊正方形的土地。fj打算在牧場上的某幾格土地裡種上美味的草,供他的奶牛們享用。遺憾的是,有些土地相當的貧瘠,不能用來放牧。並且,奶牛們喜歡獨佔一塊草地,於是fj不會選擇兩...
基本的狀壓DP
給出乙個 times 要求棋子不相鄰,求方案數 n 100 m 8 f i s sum 為零表示不相鄰 s 表示當前行中棋子的情況 解析 我們會發現乙個問題,上述式子確實可以保證上下行不相鄰,但是左右呢,對於我這個剛認識狀壓的菜雞來說,很懵逼,答 狀態壓縮的本質 存在乙個維度是在進製級別表達多組狀態...
狀壓DP的總結
狀壓dp的標誌 資料小 通過題目所給出的條件以後得到的特徵集合小 一 cf259div2 d 題目大意 保證b i 中每個數互質,給出a i 然後求1 n的abs a i b i 最小。a i 30 思路 首先得到b i 必然小於60。這個很重要,因為我們列舉的b的集合就是60.首先當b如果都取1,...