| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
4 11竟然是20299607怎么回事?用的状态压缩DP。。。。
#include<iostream>
using namespace std;
int judge( int state)
{
int cnt = 0;
while(state)
{
if(state&1) ++cnt;//该处是用于计数
else
{
//该处判断奇偶,若为奇数个连续的1则为非法状态
if( cnt & 1) return 0;
cnt = 0;//因为只计连续的,故重置
}
state>>=1;
}
if( cnt & 1) return 0;
return 1;
}
int main()
{
int row, col ;
long long dp[12][2050];
long long FULL = 0;
while( cin>>row>>col && row && col)
{
//乘积为奇数则无法完全覆盖
if( (row*col)&1 )
{
cout<<0<<endl;
continue;
}
memset(dp,0, sizeof(dp) );
//行为线性,列为指数,故交换优化性能
if(row < col)
{
int t = row; row = col; col = t;
}
FULL = (1<<col) - 1;
for(int state = 0; state <= FULL; ++state)
{
if( judge(state) )
dp[0][state] = 1;
}
for(int i = 1; i != row; ++i)
{
for(int state = 0; state <= FULL; ++state)
for(int last = 0; last <= FULL; ++last)
if( judge( last&state) && (last|state==FULL) )
dp[i][state] += dp[i-1][last];
}
cout<<dp[row-1][FULL]<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator