poj 2663 Tri Tiling

题目链接:http://poj.org/problem?id=2663

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

/*
最烦的就是这种数学推规律的题,递推公式推导对我来说相当困难,所以一开始我就考虑了用状态压缩DP来做,呵呵,不能离了老本行啊!
其实考虑一下,这道题每一行的状态就3个即1,4,7 所以状态压缩DP效率是很高的,在不优化的情况下时间也只有o(30*8*8)
完全可以秒过.

但这个题目的恶心之处在于当大矩形长度为0时铺方格的方式是1种,在这个地方连载了三次。

哎……题目链接:http://poj.org/problem?id=2663
 */

int dp[31][10];

bool ok(int x){
	if(x==1 || x==4 || x==7)return true;
	else return false;
}

void init(){
	int r,i,j;
	memset(dp,0,sizeof(dp));
	dp[0][1]=dp[0][4]=dp[0][7]=1;
	for(r=1;r<31;r++){
		for(i=0;i<8;i++){//枚举第r行状态
			for(j=0;j<8;j++){//枚举第r-1行状态
				if(i&j)continue;
				if(ok(i|j))dp[r][i]+=dp[r-1][j];
			}
		}
	}
}

int main(){
    int row;
	init();
	while(scanf("%d",&row) && row!=-1){
		if(row==0){
			printf("%d\n",1);
			continue;
		}
		if(row&1){
			printf("0\n");
			continue;
		}
		printf("%d\n",dp[row-1][0]);
	}
	return 0;
}


 

你可能感兴趣的:(优化)