USACO06NOV Corn Fields————状压DP

题解:本题主要考查状压DP
简要题意:有 m ∗ n m*n mn的田地, 0 0 0表示贫瘠,不能用来种草; 1 1 1表示肥沃,可以种草。要求没有哪两块草地有公共边,求共有几种方案。
1.状压DP:数据范围为 ( 1 ≤ m ≤ 12 ; 1 ≤ n ≤ 12 ) (1≤m≤12;1≤n≤12) (1m12;1n12),应该状压。状压DP一般步骤:
(1).预处理:处理每一行的情况,用 f [ i ] f[i] f[i]表示;
(2).判断合法性:在状态中找到合法状态,也就是不能两头牛的草地是相邻的;
(3).DP:方程很简单,求方案数。 d p [ i ] [ j ] dp[i][j] dp[i][j] i i i行的状态为 j j j时的方案数:
d p [ i ] [ j ] = ( d p [ i ] [ j ] + d p [ i − 1 ] [ k ] ) dp[i][j]=(dp[i][j]+dp[i-1][k]) dp[i][j]=(dp[i][j]+dp[i1][k])
代码如下:

#include
#include
#include
#include
using namespace std;
int dp[13][6666],f[13],a[13][13],check[6666];
int m,n,ans,mod=100000000;
int main()
{
    cin>>m>>n;
    for(int i=1;i<=m;i++)
    for(int j=1;j<=n;j++)
    {
    	cin>>a[i][j];
		f[i]=(f[i]<<1)+a[i][j];	
    }
    for(int i=0;i<=(1<>1)));
    dp[0][0]=1;
    for(int i=1;i<=m;i++)
    for(int j=0;j<=(1<

你可能感兴趣的:(DP)