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;
}

posted on 2011-05-12 15:00  宇宙吾心  阅读(241)  评论(0)    收藏  举报

导航