牛牛的DRB迷宫(DP、二进制编码器)
牛牛的DRB迷宫I
链接:https://ac.nowcoder.com/acm/contest/3004/A
来源:牛客网
题目描述
牛牛有一个n*m的迷宫,对于迷宫中的每个格子都为'R','D','B'三种类型之一,'R'表示处于当前的格子时只能往右边走'D'表示处于当前的格子时只能往下边走,而'B'表示向右向下均可以走。
我们认为迷宫最左上角的坐标为(1,1),迷宫右下角的坐标为(n,m),除了每个格子有向右移动以及向下移动的限制之外,你也不能够走出迷宫的边界。
牛牛现在想要知道从左上角走到右下角不同种类的走法共有多少种,请你告诉牛牛从(1,1)节点移动到(n,m)节点共有多少种不同的移动序列,请你输出方案数对109+7取余数后的结果。
我们认为两个移动序列是不同的,当且仅当移动序列的长度不同,或者在某一步中采取了不同的移动方式。
输入描述:
第一行输入两个正整数n,m(1≤n,m≤50)表示迷宫的大小是n行m列。
接下来n行,每行输入一个长度为m的字符串,字符串中仅包含大写字母'D','R','B'。
输出描述:
输出一行一个整数,表示方案数对109+7取余数后的结果。
输入
RBBBR
BBBBB
BBBDB
BDBBB
RBBBB
输出
这个题比较简单,是经典的走格子DP(棋盘型DP)。时空复杂度O(nm)
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const int maxn=1e5+;
using namespace std; char G[][];
LL dp[][]; int main()
{
#ifdef DEBUG
freopen("sample.txt","r",stdin);
#endif int n,m;
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++)
scanf("%s",G[i]+);
dp[][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(G[i][j-]!='D') dp[i][j]=(dp[i][j]+dp[i][j-])%mod;
if(G[i-][j]!='R') dp[i][j]=(dp[i][j]+dp[i-][j])%mod;
}
}
printf("%lld\n",dp[n][m]); return ;
}
牛牛的DRB迷宫II
链接:https://ac.nowcoder.com/acm/contest/3004/B
来源:牛客网
题目描述
牛牛有一个n*m的迷宫,对于迷宫中的每个格子都为'R','D','B'三种类型之一,'R'表示处于当前的格子时只能往右边走'D'表示处于当前的格子时只能往下边走,而'B'表示向右向下均可以走。
我们认为迷宫最左上角的坐标为(1,1),迷宫右下角的坐标为(n,m),除了每个格子有向右移动以及向下移动的限制之外,你也不能够走出迷宫的边界。
牛牛现在请你设计迷宫,但是要求你设计的迷宫符合他的要求,他要求你设计的迷宫从(1,1)节点移动到(n,m)节点不同的移动序列种类数目≡k(mod109+7)。
请你构造出符合条件的DRB迷宫,但是要求你输出的迷宫的大小不超过50*50,具体输出格式见输出描述及样例。
如果存在多解你可以构造任意符合条件的迷宫,反之如果无解,请输出一行一个字符串"No solution"。
输入描述:
仅一个整数k,你需要构造一个DRB迷宫符合从左上走到右下的方案数≡k(mod109+7)。
输出描述:
请你构造出符合条件的DRB迷宫,但是要求你输出的迷宫的大小不超过50*50。
输入
输出
RBBBR
BBBBB
BBBDB
BDBBB
RBBBB
说明
样例为《牛牛的DRB迷宫I》中的样例反过来。
备注:
构造A题中的迷宫,要求方案数整好等于给定的k,可以构造一个二进制编码器,斜对角线上的方案数恰好是1,2,4,8,16,32...,用二进制可以拼出所有的数字,所以一定能造的出来。
题解的图是这样的,即主对角线上的格子都为B,它的上面点为D,下面点为R。那么一开始这样的初始图的方案数为2n-1个。
10^9+7的二进制是30位,开G[32][30],每一列相当于一个二进制位,前面31行是二进制编码器,相当于多加了一行来在判断该二进制位是否为1后通向G[32][30]
前31行:
如果k=25,输出为:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const int maxn=1e5+;
using namespace std; char G[][]; int main()
{
#ifdef DEBUG
freopen("sample.txt","r",stdin);
#endif int k;
scanf("%d",&k);
for(int i=;i<=-;i++)//前面31行相当于二进制编码器
{
for(int j=;j<=;j++)
{
if(j<i-) G[i][j]='D';//左方为D
else if(j<i+) G[i][j]='B';//i和其左右为B
else G[i][j]='R';//右方为R
}
}
for(int i=;i<=;i++)
{
if( !(k&( <<(i-) )) ) G[i+][i]='R';//封路
G[][i]='R';//加上最后一行
}
printf("%d %d\n",,);
for(int i=;i<=;i++)
printf("%s\n",G[i]+); return ;
}
-
牛牛的DRB迷宫(DP、二进制编码器)的更多相关文章
- 2020牛客寒假算法基础集训营3 B 牛牛的DRB迷宫II
题目描述 牛牛有一个n*m的迷宫,对于迷宫中的每个格子都为'R','D','B'三种类型之一,'R'表示处于当前的格子时只能往右边走'D'表示处于当前的格子时只能往下边走,而'B'表示向右向下均可以走 ...
- luogu||P1776||宝物筛选||多重背包||dp||二进制优化
题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...
- POJ1185 状压dp(二进制//三进制)解法
很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...
- HDU-1074.DoingHomework(撞鸭dp二进制压缩版)
之前做过一道二进制压缩的题目,感觉也不是很难吧,但是由于见少识窄,这道题一看就知道是撞鸭dp,却总是无从下手....最后看了一眼博客,才顿悟,本次做这道题的作用知识让自己更多的认识二进制压缩,并无其它 ...
- 2018.09.01 poj3071Football(概率dp+二进制找规律)
传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)" role=" ...
- HDU 5677 ztr loves substring(Manacher+dp+二进制分解)
题目链接:HDU 5677 ztr loves substring 题意:有n个字符串,任选k个回文子串,问其长度之和能否等于L. 题解:用manacher算法求出所有回文子串的长度,并记录各长度回文 ...
- zoj2901【DP·二进制优化】
题意: 要排一个L长度的序列,当 j 放在 i 后面的时候会增加v[ i ][ j ]的值,求构成L长度序列的最大值. 思路: 可以想到预处理任意两点<i,j>的最大值是多少,然后题目还有 ...
- BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理 状压DP + 二进制 + 骚操作
#include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #defin ...
- hdu2993坡dp+二进制搜索
MAX Average Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- Python中eval与exec用法的区别
Python中eval,exec这两个函数有着相似的输入参数类型和执行功能,因此在用法上经常出现混淆,以至经常用错,程序易抛出错误.下面主要通过这两个函数的语法来阐述区别,并用例子来进一步说明. 首先 ...
- P1083 是否存在相等的差
P1083 是否存在相等的差 转跳点:
- UVA - 10382 Watering Grass(几何)
题意:有一个矩形,n个圆.已知矩形的长宽和圆的半径,问最少需多少个圆将矩形完全覆盖. 分析: 1.首先求圆与矩形的长的交点,若无交点,则一定不能对用最少的圆覆盖矩形有贡献. 2.如果两个圆与矩形相交所 ...
- Exchange 2003 限制用户向外网发送邮件
在企业系统中,邮件系统起着举足轻重的作用.同时为了符合企业的安全性策略,在Exchange 2003 中,常常需要限制某个用户或组向外网发送邮件,只允许此邮件在内部收发.下面我们以实验的方式来分析在E ...
- 读取docx表格中的信息
参考了 http://blog.csdn.net/qq_34475777/article/details/62055523 http://www.cnblogs.com/deepwaterplan/a ...
- redis以服务模式开机启动
第一步 修改redis为后台启动 vim /usr/redis/redis.conf #路径根据实际情况决定 # By default Redis does not run as a daemon. ...
- OIer常见问题与错误总结
作为一名OIer,无论是一名刚入门的蒟蒻,还是叱诧风云的神犇,相信都会难免去犯一些错误(废话不犯错误岂不是都满分了(ノへ ̄.).在这里总结了一些OIer常见易犯的错误,与大家共勉. 1.正常错误 可能 ...
- 干货分享:如何搞定Essay Paragraph部分?
想要写出一篇高质量的留学生作业,首先要从写好段落(paragraph)开始.那么今天就随小编一起来看看,如何写好Paragraph部分? 段落:在英文中我们俗称为paragraph,而一篇英文文章通常 ...
- GS 原理及破解 《0day安全》
1.原理: 在main函数之前,会调用__security_init_cookie函数(win10,vs2017,release,x86): 进入__security_init_cookie函数内部: ...
- python练习(一)----打印九九乘法表
打印九九乘法表 ,): ,i+): print("{0} x {1} = {2} \t".format(j,i,i*j),end='') //print默认end=‘\n’, pr ...