洛谷P1879——[USACO06NOV]玉米田Corn Fields

大致題意:有一塊地,然後,不對,這是中文題,不用說題意,還是說一下,不然這篇博客看起來就像是划水的博客一樣,就是選則一些爲1的區域去種草,不能在相鄰的區域種草,問種草的方案有多少種。很明顯的狀壓DP,首先預處理出每一行中 可以種草的情況,就是處理出那些草不相鄰的並且沒有在0上種草的合法情況。然後再對每一行的合法情況:去加上前一行的合法情況的種類,當然,要判斷能否從前一行轉移到當前行。

最後,代碼:

#include<bits/stdc++.h>
using namespace std;
int arr[15][15];
int dp[15][1<<14];
const int mod=1e9;
int F[15];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;++i)
    {
        int temp=0;
        for(int j=0;j<m;++j)
        {
            cin>>arr[i][j];
            if(arr[i][j]==0)
                temp=temp+(1<<(m-j-1));
        }
        F[i]=temp;
    }
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<(1<<m);++j)
        {
            bool flag=true;
            if((j&(j<<1))||(j&(j>>1)))
                flag=false;
            for(int k=0;k<m;++k)
            {
                if(j&F[i])
                    flag=false;
            }
            if(flag)
                dp[i][j]=1;
        }
    }
    for(int i=1;i<n;++i)
    {
        for(int j=0;j<(1<<m);++j)
        {
            if(dp[i][j])
            {
                dp[i][j]=0;
                for(int k=0;k<(1<<m);++k)
                {
                    if(!(j&k))
                        dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
                }
            }
        }
    }
    int ans=0;
    for(int i=0;i<(1<<m);++i)
    {
        ans=(ans+dp[n-1][i])%mod;
    }
    cout<<ans<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章