POJ3254(DP状态压缩)

dp[row][state] :第1到row行且第row行的状态为state的情况数。 (dp[row][state]可由dp[row-1][STATE]推出,STATE和state均为合法且STATE&state==0时,加上dp[row-1][STATE]即可)

/*
 * Cpp0.cpp
 *
 *  Created on: 2014年7月8日
 *      Author: MIAO
 */
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

int n,m;
int A[13][13];
bool valid(int row,int state)
{
	int i;
	for (i=0;i<m;i++)
		if ( (state&(1<<i)) && !A[row][i])
			return false;
	return true;
}

bool ok(int state)
{
	int i;
	for (i=1;i<m;i++)
		if ( (state&(1<<i)) && (state&(1<<(i-1))) )
			return false;
	return true;
}

int main()
{
	int i,j,k;
	scanf("%d%d",&n,&m);

	for (i=1;i<=n;i++)
		for (j=0;j<m;j++)
			scanf("%d",&A[i][j]);

	long long dp[13][1<<12];
	memset(dp,0,sizeof(dp));

	dp[0][0]=1;
	for (i=1;i<=n;i++)
		for (j=0;j<(1<<m);j++)
			if ( valid(i,j) && ok(j) )
				for (k=0;k<(1<<m);k++)
					if (valid(i-1,k) && (k&j)==0)
						dp[i][j]=(dp[i][j]+dp[i-1][k])%100000000;
	long long total=0;
	for (i=0;i<(1<<m);i++)
		total=(total+dp[n][i])%100000000;
	printf("%I64d\n",total);
}




你可能感兴趣的:(POJ3254(DP状态压缩))