动态规划专题 多阶段决策问题 蓝桥杯 K好数
问题描述
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。
输入格式
输入包含两个正整数,K和L。
输出格式
输出一个整数,表示答案对1000000007取模后的值。
样例输入
4 2
样例输出
7
数据规模与约定
对于30%的数据,KL <= 106;
对于50%的数据,K <= 16, L <= 10;
对于100%的数据,1 <= K,L <= 100。
动态规划中多阶段决策问题的思想是每做一次决策(即一个阶段)就可以得到解的一部分,那么当所有的决策做完后,完整的解就出现了。
我们以此题为例,来看如何实现该问题的过程。
先简单将题意理解一下就是要求的整个数字串中每一个数字相邻的位置它们的数字不相邻的数字串的个数。
简单地来说,把题目的规模先减小,让自己好思考整个题目的思路。
比如如果长度是1,那么除了0之外的数字都可以填入。
如果长度为2呢,我这时必须知道两件事,第一它不相邻的数字有哪些(前一位),第二前一位某个数字以它为终点它所有的满足条件的总数。可以发现我要完成第二步是一定要用到第一步的。
即每个阶段由上一个阶段决定。
如果是长度3呢,当然也必须用到长度2的阶段的解。
我们用一个二维数组图来表示这样的过程。

当然这题还有一个坑点,如果你想用上一阶段的SUM减去某几个不符合的值的话,很有可能出现由于值过大,已经取模的值减去两个很大的值而出现负数,这时最好的解决办法是全用循环加,不要出现减。
代码如下:
#include<iostream>
#include<cstdio>
#define MAXN 105
#define MOD %1000000007
using namespace std;
long long dp[MAXN][MAXN];
int main()
{
long long i,j,k,c,l,sum=;
cin>>k>>l;
//初始化第一个格子
dp[][]=;
for(i=;i<k;i++)
dp[i][]=;
sum=k-;
for(i=;i<=l;i++)
{//格子
for(j=;j<k;j++)
{
if(j==)
{
dp[j][i]=(dp[j][i]+(dp[j][i-])MOD)MOD;
for(c=;c<k;c++)
dp[j][i]=(dp[j][i]+(dp[c][i-])MOD)MOD; //必须循环加,用sum减去一些值会负溢出!!
}
else if(j==k-)
{
for(c=;c<k-;c++)
dp[j][i]=(dp[j][i]+(dp[c][i-])MOD)MOD;
dp[j][i]=(dp[j][i]+(dp[j][i-])MOD)MOD;
}
else
{
for(c=;c<k;c++)
{
if(c!=j-&&c!=j+)
dp[j][i]=(dp[j][i]+(dp[c][i-])MOD)MOD;
}
}
//cout<<dp[j][i]<<" ";
}
sum=;
for(j=;j<k;j++)
sum=((sum)MOD+(dp[j][i])MOD)MOD;
// cout<<endl;
//cout<<sum<<endl;
}
cout<<sum<<endl;
return ;
}
动态规划专题 多阶段决策问题 蓝桥杯 K好数的更多相关文章
- 蓝桥杯 K好数
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.3 ...
- 蓝桥杯 K好数(Java)
越来越觉得自己菜,一道简单的动态规划写不出来,题解也是看了很多份才看懂了,所以尽量以图表的方式写了题解,希望我的题解能帮到其他人吧.(;´Д`) 首先是题目: 输入描述: 输入包含两个正整数,K和L. ...
- 蓝桥杯 K好数(dp)
Description 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.1 ...
- 2017第八届蓝桥杯 K倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 蓝桥杯-k倍区间
http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, .. ...
- C语言网 蓝桥杯 1117K-进制数
这是一道较难的题目,我刚开始用排列组合的方式来做,并没有做出来,故运用了的深搜算法. 深搜算法的概念: 选其中一条路,遍历完成后,逐步返回直至全部遍历,最后返回起点. 解题思路 : 题目中对零的个数没 ...
- 第七届 蓝桥杯 方格填数 dfs
如下的10个格子 填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何 ...
- 蓝桥杯 方格填数 DFS 全排列 next_permutation用法
如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...
- 第十届蓝桥杯大赛-特别数的和-C++
解法一(暴力获取): #include<stdio.h> #include<stdlib.h> int main(void) { int n; ; ; printf(" ...
随机推荐
- const、typedef 、 define总结
constkeyword const=read only,修饰的为仅仅读变量而不是常量.const修饰的变量不能用作数组的维数也不能放在switch语句的case:之后. 主要作用有: 1.通过把不希 ...
- select中分割多组option
<optgroup style="color:gray; font-style:normal" label="——雪佛兰(五菱)——"></o ...
- Android最佳实践之Material Design
Material概述及主题 学习地址:http://developer.android.com/training/material/get-started.html 使用material design ...
- Solaris shell脚本学习
看懂脚本文件即可 知识点: Shell概述 Shell变量 Shell中的特殊字符 参数置换变量 控制结构 何为shell Shell就是unix提供给用户的使用界面,处于内核和应用程序之间,他是一个 ...
- MySQL提示Access denied for user ''@'localhost'”的解决
记得那时由于没有网络,把rootpassword改错了写成了: update user set password="122" where user="root" ...
- final 和static
一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...
- PythonCookBook笔记——字符串和文本
字符串和文本 使用多个分隔符分割字串 使用正则re.split()方法. >>> line = 'asdf fjdk; afed, fjek,asdf, foo' >>& ...
- JavaScript中批量设置Css样式
设置 input 元素的 属性: document.getElementsByTagName("INPUT")[0].setAttribute("属性",&q ...
- Hive调优实战
Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具. 使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别,所以需要去掉原有关系型数 ...
- unity3d从零開始(五):了解摄像机
1.简单介绍 Unity的摄像机是用来将游戏世界呈现给玩家的,游戏场景中至少有一台摄像机.也能够有多台. 2.类型 Unity中支持两种类型的摄像机,各自是Perspe ...