木块砌墙---解题报告
用 1×1×1, 1× 2×1以及2×1×1的三种木块,
搭建K × 2^N × 1的墙,不能翻转、旋转(0<=N<=1024,1<=K<=5)
有多少种方案,输出结果对1000000007取模。
举例:
举个例子如给定N=1 K=2
答案是7,如下图所示
- #include <cstdio>
- #include <string>
- #include <cstring>
- using namespace std;
- #ifdef WIN32
- #define ll __int64
- #else
- #define ll long long
- #endif
- int stan = 0,stak= 0;
- ll f[3000][1<<6];
- //将二进制转成十进制
- ll bit2int(int bit[], int k)
- {
- ll i=1;
- ll ans = bit[0];
- for (i = 1; i < k ;i++)
- ans += bit[i] * (1<<i);
- return ans;
- }
- //十进制转成2进制
- void int2bit(int bit[], ll num)
- {
- memset(bit,0,sizeof(bit));
- ll i;
- for (i = 0; num != 0 ; i++)
- {
- bit[i] = num % 2;
- num/=2;
- }
- }
- ll all = 0;
- //计算从上往下到第x行(包含上边所有行) 以x状态为y 时 的每种一种放法特例所得到的f(x-1,h),加到all上去
- void count(ll x,int bit[],ll n,int bit2[]);
- //计算从上往下到第x行(包含上边所有行) 以x状态为y 时的方法总数
- int dp(ll x,ll y)
- {
- if (x == 1 && y == (1<<stak )-1) return 0;
- if (x == 0) return 1;
- if (f[x][y] != 0) return f[x][y];//已经计算过了
- all = 0;
- //第x行的2进制表示
- int bit[6];
- int2bit(bit,y);
- //第x-1行的2进制表示
- int bit2[6];
- memset(bit2,0,sizeof(bit2));
- //计算
- count(x,bit,0,bit2);
- return (f[x][y] = all);
- }
- //第x行,从第0到n位的都放过了
- void count(ll x,int bit[],ll n,int bit2[])
- {
- //递归边界
- if (n>=stak)
- {
- //将得到的bit2[]转成状态h,就可以得到f(x-1,h). 加到 all上面去
- all = (all + dp(x-1,bit2int(bit2,stak))) % 1000000007 ;
- return ;
- }
- //这位被占了,那么这位不能放东西,且x-1的这位,必然是0
- if (bit[n] == 1)
- {
- bit2[n]=0;
- count(x,bit,n+1,bit2);
- }
- //如果这位是空的,那么3种方块都有可能放
- else
- {
- //放1*1*1
- bit2[n] = 0;
- count(x,bit,n+1,bit2);
- //放2*1*1
- bit2[n] = 1;
- count(x,bit,n+1,bit2);
- //放1*2*2 条件是这一位置不是最后一位,且下一位置可以放
- if (n<stak && bit[n+1] == 0 )
- {
- bit2[n] = 0;
- bit2[n+1] = 0;
- count(x,bit,n+2,bit2);
- }
- }
- }
- int calculate(int n,int k)
- {
- stak = k;
- stan = n;
- memset(f,0,sizeof(f));
- return dp(2*n,0);
- }
- //start 提示:自动阅卷起始唯一标识,请勿删除或增加。
- int main() {
- //自行定义n,k
- int n,k;
- //为了调试,实际提交要去掉这行
- while(1)
- {
- scanf("%d%d",&n, &k);
- printf("%d\n",calculate(n,k));
- }
- return 0;
- }
- //end //提示:自动阅卷结束唯一标识,请勿删除或增加。
木块砌墙---解题报告相关推荐
- 通过木块砌墙题目体会动态规划算法
木块砌墙题目: 用三种木块,搭建k×2n×1的墙,不能翻转.旋转木块(0≤ n≤ 1024 ,1 ≤ k ≤ 5),计算有多少种方案,输出结果对1000000007取模. 图1 木块与墙 该题目是在庞 ...
- 第三十三章:木块砌墙
题目:用 1×1×1, 1× 2×1以及2×1×1的三种木块(横绿竖蓝,且绿蓝长度均为2), 搭建高长宽分别为K × 2^N × 1的墙,不能翻转.旋转(其中,0<=N<=1024,1&l ...
- 最小操作数,木块砌墙问题
第三十二章.最小操作数 题目详情如下: 给定一个单词集合Dict,其中每个单词的长度都相同.现从此单词集合Dict中抽取两个单词A.B,我们希望通过若干次操作把单词A变成单词B,每次操作可以改变单词的 ...
- 木块砌墙算法(C#源码)
木块砌墙算法(C#版) 首先感谢 网友"⒌1→⑤Ⅵ℡" 提供算法讲解和其他网友提供的帮助. 原题链接:http://hero.pongo.cn/Question/Details?I ...
- 程序员编程艺术第三十二~三十三章:最小操作数,木块砌墙问题
第三十二~三十三章:最小操作数,木块砌墙问题 作者:July.caopengcs.红色标记.致谢:fuwutu.demo. 时间:二零一三年八月十二日 题记 再过一两月,便又到了每年的九月十月校招高峰 ...
- CF197D Infinite Maze 解题报告
CF197D Infinite Maze 解题报告 1 题目链接 原题 2 题目翻译 题目:无限的迷宫 题目描述 现在有一个 n × m n\times m n×m的一个长方形迷宫.其中每个单元格要么 ...
- 2022.2.18解题报告
2022.2.18解题报告 T1.切蛋糕 题目描述: 思路: 首先,我们先来看一下最少用几刀就可以解决所有情况. 对于一个蛋糕,要分成至少三块,那么最少都要2刀,因为0刀或1刀分出的蛋糕数量都小于3. ...
- CF225D Snake 解题报告 *
CF225D Snake 解题报告 1 题目链接 https://codeforces.com/problemset/problem/225/D 2 题目整理 题目 : 蛇 题目描述 让我们提醒你一个 ...
- 连飞学长的爱 解题报告 Apare_xzc
连飞学长的爱 解题报告 2019/2/22 vj链接 A-A CodeForces - 560A 题意: 有一套纸币,有n个币种,问是否能构成任意面值? input: n a1 a2 - an 数据范 ...
最新文章
- web标准化设计:常用的CSS命名规则
- 初学Python常见异常错误,总有一处你会遇到!
- docker之Dockerfile实践
- 双边滤波器在灰度和彩色图像处理中的应用
- servlet多线程
- python处理大文件_Python如何处理大文件(知识整理)
- 记一次服务器本地Tomcat能访问,但远程访问不了的解决方案
- 【Hadoop】MapReduce
- 对JavaScript解析JSON格式数据的理解
- kettle使用_ETL工具(kettle)使用系列(二)
- day1 java基础回顾-	文件路径
- 数据结构最短路径例题_数据结构(五)图---最短路径(迪杰斯特拉算法)
- 计算机软件技术发展应用论文,计算机软件毕业论文计算机软件技术发展应用.docx...
- 用迅雷下载百度网盘的文件
- numpy矩阵与向量类型的向量乘法
- office显示“你的许可证并非正版....”
- 怎么用python编简单游戏大全_适合新手练手的三个python简单小游戏
- 通过冥想解除困意,提升精神
- JavaScript:在一段时间不连续的数据中获取某一段时间段内相同时间间隔的数据
- 寂寂的流年,时光日渐青翠