Как серия давления II.
Название эффекта: Учитывая \ (п * т \) матрица, которая может поставить некоторые позиции, некоторые из них не может. Положения сетки поставить левый и правый не может положить его вниз. В ответ на просьбу поставить программу , сколько сетки.
Учитывая \ (п, т \) мал, как это форма давления.
Рассмотрим давление, как представление, мы помещаем каждую строку \ (01 \) матрица прессуется в двоичной, это указывает на состояние линии.
Поэтому после того, как мы закончили напорную линию, по- видимому , \ (п \) число указывает на состояние каждой линии. То есть общее число состояний \ (п-2 ^ \) .
Кроме того, поскольку он не может ставить направо и налево, то первый такой правовой статус справиться с этим.
Продолжайте считать \ (дп \) а.
Через каждую строку (сжатое состояние), для каждого состояния, чтобы перечислить то, что он может соответствовать статусу и статусу его следующей линии может соответствовать. Мы можем поставить перед вашим опытом с легитимными программами булевых массивов.
Таким образом , мы должны сначала выбрать легитимное государство. Во- вторых, это состояние не может быть предоставлена карта местности , посаженное в названии. Мы можем использовать \ (J & тр [я] == J \) , чтобы определить , является ли законным.
Итак перечислим следующее состояние линии. Очевидно , вверх и вниз , два ряда не могут иметь смежную \ (1 \) , \ (J & к \) может быть.
Тогда что любима кумулятивного государства.
Тема сделана. Обратите внимание, что левый и правый суд, они могут:
$ Я и (я << 1) == 0 $ \ (&& \) \ (я & (я >> 1) == 0 \)
Обратите внимание, приоритет, привычки круглые скобки.
\(Код:\)
#include<iostream>
using namespace std;
int n,m,a[20][20],mp[20];
int dp[20][5000],Ans;
bool state[5000];
const int Hws=100000000;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
mp[i]=(mp[i]<<1)+a[i][j];
for(int i=0;i<(1<<m);++i)if(((i&(i<<1))==0)&&((i&(i>>1)))==0)state[i]=1;
dp[0][0]=1;
for(int i=1;i<=n;++i){
for(int j=0;j<(1<<m);++j)
if(state[j]&&((j&mp[i])==j)){
for(int k=0;k<(1<<m);++k)
if((k&j)==0){
dp[i][j]+=dp[i-1][k];
dp[i][j]%=Hws;
}
}
}
for(int i=0;i<(1<<m);++i)Ans+=dp[n][i],Ans%=Hws;
printf("%d\n",Ans);
return 0;
}