垒骰子(递归和动态规划)
垒骰子
资源限制 时间限制:1.0s 内存限制:256.0MB
赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。
atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。
不要小看了 atm 的骰子数量哦~
「输入格式」
第一行两个整数 n m
n表示骰子数目
接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。
「输出格式」
一行一个数,表示答案模 10^9 + 7 的结果。
「样例输入」
2 1
1 2
「样例输出」
544
「数据范围」
对于 30% 的数据:n <= 5
对于 60% 的数据:n <= 100
对于 100% 的数据:0 < n <= 10^9, m <= 36
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 2000ms
1.暴力递归(递归)上至下
#include<iostream>
#include<stdio.h>
using namespace std;
int op[7];bool conflict[7][7];int main(){op[1]=4;op[4]=1;op[2]=5;op[5]=2;op[3]=6;op[6]=3;int n,m;int x,y;scanf("%d%d",&n,&m);for(int i=0;i<m;i++){scanf("%d%d",&x,&y);conflict[x][y]=true;conflict[y][x]=true;}long long dp[2][7]; //[第几层][朝上数字] dp[][]:第几层x朝上的可能 //第几层用0和1轮流,因为只涉及到第n层和第n-1层(共两层)int cnt=0;for(int up=1;up<=6;up++){ //第一层的六种朝上情况 (初始化)dp[cnt][up]=1; //up=1时有四种可能(四个侧面)up=2时有四种可能(四个侧面)...} for(int level=2;level<=n;level++){cnt=1-cnt; //第n层时n=1for(int up2=1;up2<=6;up2++){ //第n层 (可想为第2层)dp[cnt][up2]=0; for(int up1=1;up1<=6;up1++){ //第n-1层 (可想为第1层)if(conflict[op[up2]][up1]) continue;dp[cnt][up2]=dp[cnt][up2]+dp[1-cnt][up1];}}}long long sum=0;for(int up2=1;up2<=6;up2++){sum+=dp[cnt][up2]; }//快速幂求n的4次方 long long ans=1;long long tmp=4;long long p=n;while(p!=0){if(p&1==1) ans=(ans*tmp)%1000000007;tmp=(tmp*tmp)%1000000007;p>>=1;}printf("%lli",(sum*ans)%1000000007);return 0;
}
2.动态规划(递推)下至上垒
#include<iostream>
#include<stdio.h>
using namespace std;
int op[7];bool conflict[7][7];int main(){op[1]=4;op[4]=1;op[2]=5;op[5]=2;op[3]=6;op[6]=3;int n,m;int x,y;scanf("%d%d",&n,&m);for(int i=0;i<m;i++){scanf("%d%d",&x,&y);conflict[x][y]=true;conflict[y][x]=true;}long long dp[2][7]; //[第几层][朝上数字] dp[][]:第几层x朝上的可能 //第几层用0和1轮流,因为只涉及到第n层和第n-1层(共两层)int cnt=0;for(int up=1;up<=6;up++){ //第一层的六种朝上情况 (初始化)dp[cnt][up]=1; //up=1时有四种可能(四个侧面)up=2时有四种可能(四个侧面)...} for(int level=2;level<=n;level++){cnt=1-cnt; //第n层时n=1for(int up2=1;up2<=6;up2++){ //第n层 (可想为第2层)dp[cnt][up2]=0; for(int up1=1;up1<=6;up1++){ //第n-1层 (可想为第1层)if(conflict[op[up2]][up1]) continue;dp[cnt][up2]=dp[cnt][up2]+dp[1-cnt][up1];}}}long long sum=0;for(int up2=1;up2<=6;up2++){sum+=dp[cnt][up2]; }//快速幂求n的4次方 long long ans=1;long long tmp=4;long long p=n;while(p!=0){if(p&1==1) ans=(ans*tmp)%1000000007;tmp=(tmp*tmp)%1000000007;p>>=1;}printf("%lli",(sum*ans)%1000000007);return 0;
}
3、用矩阵(待更新)
垒骰子(递归和动态规划)相关推荐
- 蓝桥杯15届第九题——垒骰子(dfs、动态规划、矩阵)
前言:该题很值得研究,为什么这么说呢? 题目考查了较多方面的知识点,相信如果将这道题完全理解的话,我们对考查的知识点应用起来会更加得心应手. 下面我会通过三种方式将题目解析透彻,从浅入深. 垒骰子题目 ...
- 蓝桥杯 - 垒骰子(动态规划+矩阵快速幂优化)
垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...
- 蓝桥杯垒骰子(动态规划)
1. 问题描述: 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰 ...
- 矩阵快速幂+动态规划=蓝桥杯 垒骰子
矩阵快速幂+动态规划=蓝桥杯 垒骰子 如果还不知道什么是矩阵快速幂,可以参加我的另一篇文章:矩阵快速幂详解 题目 分析 看到 nnn 的范围达到了 10910^{9}109 ,如果使用暴力搜索是不现实 ...
- 垒骰子动态规划-蓝桥杯
垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...
- 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - I. 垒骰子
垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...
- 【蓝桥杯】15年初赛 垒骰子,矩阵快速幂
题目描述 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 ...
- 第六届蓝桥杯JavaC组省赛真题——详细答案对照(包含垒骰子)
A.隔行变色 Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式. 小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,.... 现在小明想知道,从第21行 ...
- 垒骰子|2015年蓝桥杯B组题解析第九题-fishers
垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...
最新文章
- javascript 编辑网页
- Javascript中的函数重载-最佳做法
- virt-v2v 使用指南
- python list,str的拼接与转换
- 黑客攻防技术宝典web实战篇:攻击应用程序逻辑习题
- 无需一行代码,完成模型训练和部署,这个AI工具开始公测
- java.lang.ClassNotFoundException: org.apache.commons.codec.DecoderException
- 自动驾驶即将迎来下一个飞跃?
- 第15周学习进度情况
- RFC791:INTERNET PROTOCOL网络协议
- php中in array函数_php中in_array函数的用法
- Evision显示器无法设置1440*900分辨率的问题解决
- 如何提取视频中的音频,不需要软件,在线就能做到
- GIF转MP4 - 在线将GIF动态图转为MP4视频文件
- 硬盘分区丢失怎么找回呢?
- 在RISC-V星光板上创建Debian系统镜像
- “Tplink端口映射设置”教程---快解析
- 正则表达式 - 常用的正则表达式级正则的捕获
- 【html实现记住账号、记住密码功能】
- 数据埋点 ios android,iOS端数据埋点方案实现