没啥好说的了,主要是两行一起搜索,每次迭代的前提是pre行的y列已经被填满。
因为1*2砖块填充问题陷入定向思维,一直在处理一行,然后卡了N天啊!!!
//SGU 131 Hardwood floor //状压DP //by night_watcher #include<iostream> #include<cstring> using namespace std; #define ll long long int n,m; ll cnt; ll dp[11][1<<9]; int f(int i){ return 1<<i; } void dfs(int x,int y,int pre,int now){ if(y>=m){ dp[x+1][now]+=cnt; return ; } if(pre&f(y)&&now&f(y)){ dfs(x,y+1,pre,now); return ; } if(!(pre&f(y))&&!(now&f(y))){ dfs(x,y,pre|f(y),now|f(y)); if(y+1<m){ if(!(pre&f(y+1))){ dfs(x,y+1,pre|f(y)|f(y+1),now|f(y)); } if(!(now&f(y+1))){ dfs(x,y+1,pre|f(y),now|f(y)|f(y+1)); } if(!(now&f(y+1))&&!(pre&f(y+1))){ dfs(x,y+1,pre|f(y)|f(y+1),now|f(y+1)); } } return ; } if(!(pre&f(y))&&now&f(y)){ if(y+1<m&&!(pre&f(y+1))&&!(now&f(y+1))){ dfs(x,y+1,pre|f(y)|f(y+1),now|f(y+1)); } return ; } if(pre&f(y)&&!(now&f(y))){ dfs(x,y+1,pre,now); if(y+1<m&&!(pre&f(y+1))&&!(now&f(y+1))){ dfs(x,y+1,pre|f(y+1),now|f(y)|f(y+1)); } if(y+1<m&&!(now&f(y+1))){ dfs(x,y+1,pre,now|f(y)|f(y+1)); } return ; } } int main(){ int i,j; while(cin>>n>>m){ int max=1<<m; memset(dp,0,sizeof(dp)); dp[0][max-1]=1; for(i=0;i<n;i++){ for(j=0;j<max;j++){ if(dp[i][j]){ cnt=dp[i][j]; dfs(i,0,j,0); } } } cout<<dp[n][max-1]<<endl; } return 0; }