和顺网站建设桂林网络公司有哪些
和顺网站建设,桂林网络公司有哪些,南京做网站外包,百度网址浏览大全NC51189 Mondriaan’s Dream
题意#xff1a;
n * m的矩阵#xff0c;用1 * 2和2 * 1的砖快密铺#xff0c;问多少种方法#xff1a;
题解#xff1a;
方法1#xff1a; 我们现在规定砖头的竖放的上部分为1#xff0c;砖头的横放或者是竖放的下部分为0 我们每两层进…NC51189 Mondriaan’s Dream
题意
n * m的矩阵用1 * 2和2 * 1的砖快密铺问多少种方法
题解
方法1 我们现在规定砖头的竖放的上部分为1砖头的横放或者是竖放的下部分为0 我们每两层进行分析分析01的关系 我们设上层为k下层为j 因为竖砖上为1下为0所以上下两层的结果必然都是0jk 0 且j|k中连续的0均为偶数因为竖砖和横砖的组合只有两种情况如下图 蓝色字为两行或的结果或的结果中0只能是连续偶数个出现不可能连续奇数个出现 方法二 我们用01表示这个地方放不放砖 第i行只与第i-1行相关 枚举第i-1行的每个状态就可以推出第i行的状态 如果第i-1行的某处没放那么第i行这个位置必须放竖砖所以对上一行状态按位取反之后的1的位置就是放置了竖方块的状态。 然后枚举这行其他点的位置记录答案 这个思路很常规但也很妙
代码
#includebits/stdc.h
using namespace std;typedef long long LL;int n, m;
int const N 1e4 10;
LL f[20][N];
int st[N];
vectorint state[N];int main() {while (cin n m n m) {// 初始化memset(f, 0, sizeof f);f[0][0] 1;for (int i 0; i 1 n; i) state[i].clear();// 预处理stfor (int i 0; i 1 n; i ) {int cnt 0;st[i] true;for (int j 0; j n; j )if (i j 1) {//如果第j位是1 统计之前连续0的数量奇偶性 if (cnt 1) st[i] false;cnt 0;}else cnt ;//如果是第j位是0记录连续0的数量 if (cnt 1) st[i] false;}// 预处理statefor (int i 0; i 1 n; i) {for (int j 0; j 1 n; j) {if ((i j) 0 st[i | j]) state[i].push_back(j);}}// dp转移for (int i 1; i m; i) {for (int j 0; j 1 n; j) {for (int k 0; k state[j].size(); k) { // 获得所有的合法方案f[i][j] f[i - 1][state[j][k]];}}}printf(%lld\n, f[m][0]);}return 0;
}#include iostream
#include cstring
#include cstdio
using namespace std;
typedef long long ll;
int n,m;
ll add;
ll dp[2][112];
void dfs(int i,int s,int cur)
{if(curm) {dp[i][s]add;return;}dfs(i,s,cur1);if(curm-1 !(s(1cur)) !(s1(cur1)) )dfs(i,s|(1cur)|1(cur1),cur2);
}
int main()
{while(scanf(%d%d,n,m),nm){if(n*m%2) {printf(0\n);continue;}int rt(1m)-1;add1;memset(dp,0,sizeof(dp));dfs(0,0,0);for(int i1;in;i)for(int j0;jrt;j)if(dp[(i-1)%2][j]){adddp[(i-1)%2][j];dfs(i%2,~jrt,0);} printf(%I64d\n,dp[(n-1)%2][rt]);}return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88194.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!