2019.02.19【UVa11270】Tiling Dominoes(轮廓线DP)

传送门


补档计划无题解。

这道题本来直接DP就行了,不需要用哈希表,但是一直莫名其妙的超时,于是就交了一个表上去。(似乎没有中间限制的轮廓线都可以交表)


代码(轮廓线DP):

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc get_char
#define cs const

template<class T1,class T2>
struct Map{
	static cs int magic=4001;
	T1 key[magic];
	T2 val[magic];
	int sta[magic],top;
	
	Map(){memset(key,-1,sizeof key);}
	
	struct iterator{
		int now;
		Map *belong;
		iterator(Map *a,cs int &_now):belong(a),now(_now){}
		T1 key(){return belong->key[belong->sta[now]];}
		T2 val(){return belong->val[belong->sta[now]];}
		iterator operator++(){
			++now;
			return *this;
		}
		bool operator!=(cs iterator &b){
			return now!=b.now||belong!=b.belong;
		}
	};
	
	iterator begin(){return iterator(this,1);}
	iterator end(){return iterator(this,top+1);}
	
	cs T2 &operator[](cs T1 &k)cs{
		int h=k%magic;
		while((~key[h])&&(key[h]^k))h=(h+1)%magic;
		return val[h];
	}
	
	T2 &operator[](cs T1 &k){
		int h=k%magic;
		while((~key[h])&&(key[h]^k))h=(h+1)%magic;
		if(key[h]^k){
			sta[++top]=h;
			key[h]=k;
		}
		return val[h];
	}
	
	void clear(){
		while(top){
			key[sta[top]]=-1;
			val[sta[top]]=0;
			--top;
		}
	}
};

Map<int,ll> ma[2];

inline int get_state(int s,int j){
	return (s&(1<<j))>>j;
}

inline int set_state(int s,int j,int b){
	return (s&~(1<<j))|(b<<j);
}

inline int set_state(int s,int j,int bn,int bj){
	return (s&~(3<<j))|((bn|(bj<<1))<<j);
}

int n,m,pre;
ll res[105][105];
inline void dp(){
	if(m>n)swap(n,m);
	ma[0].clear();ma[1].clear();pre=0;
	ma[pre][0]=1;
	for(int re i=0;i<n;++i)
	for(int re j=0;j<m;++j){
		int now=pre^1;
		ma[now].clear();
		for(Map<int,ll>::iterator it=ma[pre].begin();it!=ma[pre].end();++it){
			int s=it.key();
			ll nowans=it.val();
			if(j==0)s<<=1;
			int sl=get_state(s,j),su=get_state(s,j+1);
			if(sl&&su)continue;
			else if(!sl&&!su){
				ma[now][set_state(s,j,1,0)]+=nowans;
				ma[now][set_state(s,j,0,1)]+=nowans;
			}
			else if(!sl||!su){
				ma[now][set_state(s,j,0,0)]+=nowans;
			}
			else assert(0);
		}
		pre=now;
	}
	cout<<ma[pre][0]<<"\n";
}

signed main(){
	memset(res,-1,sizeof res);
	while(~scanf("%d%d",&n,&m))dp();
	return 0;
}

代码(表):

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll res[105][105];
signed main(){
    res[1][1]=res[1][1]=0;
    res[1][2]=res[2][1]=1;
    res[1][3]=res[3][1]=0;
    res[1][4]=res[4][1]=1;
    res[1][5]=res[5][1]=0;
    res[1][6]=res[6][1]=1;
    res[1][7]=res[7][1]=0;
    res[1][8]=res[8][1]=1;
    res[1][9]=res[9][1]=0;
    res[1][10]=res[10][1]=1;
    res[1][11]=res[11][1]=0;
    res[1][12]=res[12][1]=1;
    res[1][13]=res[13][1]=0;
    res[1][14]=res[14][1]=1;
    res[1][15]=res[15][1]=0;
    res[1][16]=res[16][1]=1;
    res[1][17]=res[17][1]=0;
    res[1][18]=res[18][1]=1;
    res[1][19]=res[19][1]=0;
    res[1][20]=res[20][1]=1;
    res[1][21]=res[21][1]=0;
    res[1][22]=res[22][1]=1;
    res[1][23]=res[23][1]=0;
    res[1][24]=res[24][1]=1;
    res[1][25]=res[25][1]=0;
    res[1][26]=res[26][1]=1;
    res[1][27]=res[27][1]=0;
    res[1][28]=res[28][1]=1;
    res[1][29]=res[29][1]=0;
    res[1][30]=res[30][1]=1;
    res[1][31]=res[31][1]=0;
    res[1][32]=res[32][1]=1;
    res[1][33]=res[33][1]=0;
    res[1][34]=res[34][1]=1;
    res[1][35]=res[35][1]=0;
    res[1][36]=res[36][1]=1;
    res[1][37]=res[37][1]=0;
    res[1][38]=res[38][1]=1;
    res[1][39]=res[39][1]=0;
    res[1][40]=res[40][1]=1;
    res[1][41]=res[41][1]=0;
    res[1][42]=res[42][1]=1;
    res[1][43]=res[43][1]=0;
    res[1][44]=res[44][1]=1;
    res[1][45]=res[45][1]=0;
    res[1][46]=res[46][1]=1;
    res[1][47]=res[47][1]=0;
    res[1][48]=res[48][1]=1;
    res[1][49]=res[49][1]=0;
    res[1][50]=res[50][1]=1;
    res[1][51]=res[51][1]=0;
    res[1][52]=res[52][1]=1;
    res[1][53]=res[53][1]=0;
    res[1][54]=res[54][1]=1;
    res[1][55]=res[55][1]=0;
    res[1][56]=res[56][1]=1;
    res[1][57]=res[57][1]=0;
    res[1][58]=res[58][1]=1;
    res[1][59]=res[59][1]=0;
    res[1][60]=res[60][1]=1;
    res[1][61]=res[61][1]=0;
    res[1][62]=res[62][1]=1;
    res[1][63]=res[63][1]=0;
    res[1][64]=res[64][1]=1;
    res[1][65]=res[65][1]=0;
    res[1][66]=res[66][1]=1;
    res[1][67]=res[67][1]=0;
    res[1][68]=res[68][1]=1;
    res[1][69]=res[69][1]=0;
    res[1][70]=res[70][1]=1;
    res[1][71]=res[71][1]=0;
    res[1][72]=res[72][1]=1;
    res[1][73]=res[73][1]=0;
    res[1][74]=res[74][1]=1;
    res[1][75]=res[75][1]=0;
    res[1][76]=res[76][1]=1;
    res[1][77]=res[77][1]=0;
    res[1][78]=res[78][1]=1;
    res[1][79]=res[79][1]=0;
    res[1][80]=res[80][1]=1;
    res[1][81]=res[81][1]=0;
    res[1][82]=res[82][1]=1;
    res[1][83]=res[83][1]=0;
    res[1][84]=res[84][1]=1;
    res[1][85]=res[85][1]=0;
    res[1][86]=res[86][1]=1;
    res[1][87]=res[87][1]=0;
    res[1][88]=res[88][1]=1;
    res[1][89]=res[89][1]=0;
    res[1][90]=res[90][1]=1;
    res[1][91]=res[91][1]=0;
    res[1][92]=res[92][1]=1;
    res[1][93]=res[93][1]=0;
    res[1][94]=res[94][1]=1;
    res[1][95]=res[95][1]=0;
    res[1][96]=res[96][1]=1;
    res[1][97]=res[97][1]=0;
    res[1][98]=res[98][1]=1;
    res[1][99]=res[99][1]=0;
    res[1][100]=res[100][1]=1;
    res[2][2]=res[2][2]=2;
    res[2][3]=res[3][2]=3;
    res[2][4]=res[4][2]=5;
    res[2][5]=res[5][2]=8;
    res[2][6]=res[6][2]=13;
    res[2][7]=res[7][2]=21;
    res[2][8]=res[8][2]=34;
    res[2][9]=res[9][2]=55;
    res[2][10]=res[10][2]=89;
    res[2][11]=res[11][2]=144;
    res[2][12]=res[12][2]=233;
    res[2][13]=res[13][2]=377;
    res[2][14]=res[14][2]=610;
    res[2][15]=res[15][2]=987;
    res[2][16]=res[16][2]=1597;
    res[2][17]=res[17][2]=2584;
    res[2][18]=res[18][2]=4181;
    res[2][19]=res[19][2]=6765;
    res[2][20]=res[20][2]=10946;
    res[2][21]=res[21][2]=17711;
    res[2][22]=res[22][2]=28657;
    res[2][23]=res[23][2]=46368;
    res[2][24]=res[24][2]=75025;
    res[2][25]=res[25][2]=121393;
    res[2][26]=res[26][2]=196418;
    res[2][27]=res[27][2]=317811;
    res[2][28]=res[28][2]=514229;
    res[2][29]=res[29][2]=832040;
    res[2][30]=res[30][2]=1346269;
    res[2][31]=res[31][2]=2178309;
    res[2][32]=res[32][2]=3524578;
    res[2][33]=res[33][2]=5702887;
    res[2][34]=res[34][2]=9227465;
    res[2][35]=res[35][2]=14930352;
    res[2][36]=res[36][2]=24157817;
    res[2][37]=res[37][2]=39088169;
    res[2][38]=res[38][2]=63245986;
    res[2][39]=res[39][2]=102334155;
    res[2][40]=res[40][2]=165580141;
    res[2][41]=res[41][2]=267914296;
    res[2][42]=res[42][2]=433494437;
    res[2][43]=res[43][2]=701408733;
    res[2][44]=res[44][2]=1134903170;
    res[2][45]=res[45][2]=1836311903;
    res[2][46]=res[46][2]=2971215073;
    res[2][47]=res[47][2]=4807526976;
    res[2][48]=res[48][2]=7778742049;
    res[2][49]=res[49][2]=12586269025;
    res[2][50]=res[50][2]=20365011074;
    res[3][3]=res[3][3]=0;
    res[3][4]=res[4][3]=11;
    res[3][5]=res[5][3]=0;
    res[3][6]=res[6][3]=41;
    res[3][7]=res[7][3]=0;
    res[3][8]=res[8][3]=153;
    res[3][9]=res[9][3]=0;
    res[3][10]=res[10][3]=571;
    res[3][11]=res[11][3]=0;
    res[3][12]=res[12][3]=2131;
    res[3][13]=res[13][3]=0;
    res[3][14]=res[14][3]=7953;
    res[3][15]=res[15][3]=0;
    res[3][16]=res[16][3]=29681;
    res[3][17]=res[17][3]=0;
    res[3][18]=res[18][3]=110771;
    res[3][19]=res[19][3]=0;
    res[3][20]=res[20][3]=413403;
    res[3][21]=res[21][3]=0;
    res[3][22]=res[22][3]=1542841;
    res[3][23]=res[23][3]=0;
    res[3][24]=res[24][3]=5757961;
    res[3][25]=res[25][3]=0;
    res[3][26]=res[26][3]=21489003;
    res[3][27]=res[27][3]=0;
    res[3][28]=res[28][3]=80198051;
    res[3][29]=res[29][3]=0;
    res[3][30]=res[30][3]=299303201;
    res[3][31]=res[31][3]=0;
    res[3][32]=res[32][3]=1117014753;
    res[3][33]=res[33][3]=0;
    res[4][4]=res[4][4]=36;
    res[4][5]=res[5][4]=95;
    res[4][6]=res[6][4]=281;
    res[4][7]=res[7][4]=781;
    res[4][8]=res[8][4]=2245;
    res[4][9]=res[9][4]=6336;
    res[4][10]=res[10][4]=18061;
    res[4][11]=res[11][4]=51205;
    res[4][12]=res[12][4]=145601;
    res[4][13]=res[13][4]=413351;
    res[4][14]=res[14][4]=1174500;
    res[4][15]=res[15][4]=3335651;
    res[4][16]=res[16][4]=9475901;
    res[4][17]=res[17][4]=26915305;
    res[4][18]=res[18][4]=76455961;
    res[4][19]=res[19][4]=217172736;
    res[4][20]=res[20][4]=616891945;
    res[4][21]=res[21][4]=1752296281;
    res[4][22]=res[22][4]=4977472781;
    res[4][23]=res[23][4]=14138673395;
    res[4][24]=res[24][4]=40161441636;
    res[4][25]=res[25][4]=114079985111;
    res[5][5]=res[5][5]=0;
    res[5][6]=res[6][5]=1183;
    res[5][7]=res[7][5]=0;
    res[5][8]=res[8][5]=14824;
    res[5][9]=res[9][5]=0;
    res[5][10]=res[10][5]=185921;
    res[5][11]=res[11][5]=0;
    res[5][12]=res[12][5]=2332097;
    res[5][13]=res[13][5]=0;
    res[5][14]=res[14][5]=29253160;
    res[5][15]=res[15][5]=0;
    res[5][16]=res[16][5]=366944287;
    res[5][17]=res[17][5]=0;
    res[5][18]=res[18][5]=4602858719;
    res[5][19]=res[19][5]=0;
    res[5][20]=res[20][5]=57737128904;
    res[6][6]=res[6][6]=6728;
    res[6][7]=res[7][6]=31529;
    res[6][8]=res[8][6]=167089;
    res[6][9]=res[9][6]=817991;
    res[6][10]=res[10][6]=4213133;
    res[6][11]=res[11][6]=21001799;
    res[6][12]=res[12][6]=106912793;
    res[6][13]=res[13][6]=536948224;
    res[6][14]=res[14][6]=2720246633;
    res[6][15]=res[15][6]=13704300553;
    res[6][16]=res[16][6]=69289288909;
    res[7][7]=res[7][7]=0;
    res[7][8]=res[8][7]=1292697;
    res[7][9]=res[9][7]=0;
    res[7][10]=res[10][7]=53175517;
    res[7][11]=res[11][7]=0;
    res[7][12]=res[12][7]=2188978117;
    res[7][13]=res[13][7]=0;
    res[7][14]=res[14][7]=90124167441;
    res[8][8]=res[8][8]=12988816;
    res[8][9]=res[9][8]=108435745;
    res[8][10]=res[10][8]=1031151241;
    res[8][11]=res[11][8]=8940739824;
    res[8][12]=res[12][8]=82741005829;
    res[9][9]=res[9][9]=0;
    res[9][10]=res[10][9]=14479521761;
    res[9][11]=res[11][9]=0;
    res[10][10]=res[10][10]=258584046368;
    int n,m;
    while(~scanf("%d%d",&n,&m))cout<<res[n][m]<<"\n";
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值