poj 2411
经典状态dp
状态复用了
代码:
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
int n,m;
long long dp[12][2048];
int ok(int s){
int i,j,k;
for(i=0;i<m;)
{
j=s&(1<<i);
if(j>0)
{
if(i+1>=m) return 0;
if((s&(1<<(1+i)))==0) return 0;
i+=2;
}
else
i++;
}
return 1;
}
int ok2(int s,int t){
int i,j,k;
for(i=0;i<m;)
{
j=s&(1<<i);
k=t&(1<<i);
if(j==0&&k==0) return 0;
if(j!=0&&k!=0)
{
if(i+1>=m) return 0;
if((s&(1<<(1+i)))==0) return 0;
if((t&(1<<(1+i)))==0) return 0;
i+=2;
}
else
i++;
}
return 1;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,maxx;
while(cin>>i>>j)
{
if(i==0&&j==0) return;
memset(dp,0,sizeof(dp));
n=max(i,j);
m=min(i,j);
maxx=pow(2.,m);
for(i=0;i<maxx;i++)
if(ok(i))
dp[0][i]=1;
for(i=1;i<n;i++)
for(j=0;j<maxx;j++)
for(k=0;k<maxx;k++)
if(ok2(j,k))
dp[i][j]+=dp[i-1][k];
cout<<dp[n-1][maxx-1]<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号