poj 2411 Mondriaan's Dream dp

一个比较简单的状压dp,记录下每个点的状态即可。

 

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

const int maxn=13;

long long dp[maxn][maxn][2100];

int main()

{

    int n,m;

    while(scanf("%d %d",&n,&m),n||m)

    {

        int tmp=1<<m;

        memset(dp,0,sizeof(dp));

        dp[1][1][0]=1;

        for(int i=1;i<=n;i++)

        {

            for(int j=1;j<=m;j++)

            for(int k=0;k<tmp;k++)

            if(k&(1<<j-1))

            {

                dp[i][j+1][k^(1<<j-1)]+=dp[i][j][k];

            }

            else

            {

                dp[i][j+1][k|(1<<j-1)]+=dp[i][j][k];

                if(j!=m)

                if((k&(1<<j))==0)

                dp[i][j+1][k|(1<<j)]+=dp[i][j][k];

            }

            for(int k=0;k<tmp;k++)

            dp[i+1][1][k]=dp[i][m+1][k];

        }

        cout<<dp[n][m+1][0]<<endl;

    }

    return 0;

}


 

 

你可能感兴趣的:(poj)