[Пояснения] кукурузное

Как серия давления 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;
}

рекомендация

отwww.cnblogs.com/h-lka/p/11402173.html
рекомендация