轮廓线 DP uva 11270
1*2 填满有多少种方法
就是状态压缩
#include<stdio.h> #include<algorithm> #include<stdlib.h> #include<cstring> #include<iostream> #include<string> #include<cmath> #include<vector> #include<queue> #include<deque> #include<map> #include<iterator> #include<stack> using namespace std; #define ll long long #define MAXN 110 #define inf 2000000007 ll dp[2][(1<<11)+10]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(dp,0,sizeof(dp)); if(n<m) swap(n,m); int now=0,pre=1; int e=(1<<m)-1; dp[now][e]=1; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { swap(now,pre); memset(dp[now],0,sizeof(dp[now])); for(int k=0;k<=e;k++) { if(j&&!(k&(1<<(j-1)))&&(k&(1<<j))) //横的 前面一格没放 但是这个又是要放的(还没用过) dp[now][k|(1<<(j-1))]+=dp[pre][k]; dp[now][k^(1<<j)]+=dp[pre][k]; // 这一格不放 这一格竖的放 体会 } } } printf("%lld\n",dp[now][e]); } return 0; }
posted on 2017-05-03 12:28 HelloWorld!--By-MJY 阅读(146) 评论(0) 编辑 收藏 举报