问题描述

如果一个自然数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好数的更多相关文章

  1. 蓝桥杯 K好数

    如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.3 ...

  2. 蓝桥杯 K好数(Java)

    越来越觉得自己菜,一道简单的动态规划写不出来,题解也是看了很多份才看懂了,所以尽量以图表的方式写了题解,希望我的题解能帮到其他人吧.(;´Д`) 首先是题目: 输入描述: 输入包含两个正整数,K和L. ...

  3. 蓝桥杯 K好数(dp)

    Description 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.1 ...

  4. 2017第八届蓝桥杯 K倍区间

    标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...

  5. 蓝桥杯-k倍区间

    http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, .. ...

  6. C语言网 蓝桥杯 1117K-进制数

    这是一道较难的题目,我刚开始用排列组合的方式来做,并没有做出来,故运用了的深搜算法. 深搜算法的概念: 选其中一条路,遍历完成后,逐步返回直至全部遍历,最后返回起点. 解题思路 : 题目中对零的个数没 ...

  7. 第七届 蓝桥杯 方格填数 dfs

    如下的10个格子  填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何 ...

  8. 蓝桥杯 方格填数 DFS 全排列 next_permutation用法

    如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...

  9. 第十届蓝桥杯大赛-特别数的和-C++

    解法一(暴力获取): #include<stdio.h> #include<stdlib.h> int main(void) { int n; ; ; printf(" ...

随机推荐

  1. hql 多对多查询

    这种查询,hibernate 建议用 From Dealer s inner join fetch s.carSerieses cs  实现,注意这种实现只支持b.c,不支持b.cs. 如果要用b.c ...

  2. C语言变长数组 struct中char data[0]的用法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...

  3. Android自己定义View的实现方法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17357967 不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了.回 ...

  4. hdu 2842(矩阵高速幂+递推)

    题意:一个中国环的游戏,规则是一个木棒上有n个环.第一个环是能够任意放上或拆下的,剩下的环x假设想放上或拆下必须前一个环x-1是放上的且前x-2个环所有是拆下的,问n个环最少多少次操作能够所有拆掉. ...

  5. 浅析嵌入式C优化技巧

    嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完毕一种或几种特定功能的计算机系统,具有自己主动化程度高,响应速度快等长处,眼下已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环 ...

  6. Kubernetes对象之Pod

    系列目录 Pod是Kubernetes调度的最小单元.一个Pod可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机.Pod的设计理念是为了支持多个容器在一个Pod中共享网络和文件系统 因此 ...

  7. 用callgraph生成的两张函数调用关系图

    参考这里,感觉很Cool吧. Linux-0.11函数调用关系图: QEMU函数调用关系图:

  8. 虚拟网卡TUN/TAP 驱动程序设计原理

    昨天韦哥写了<Linux下Tun/Tap设备通信原理>一文,只提到了两个使用Tun的用户进程之间的通信路径,并没有说明Tun虚拟网卡驱动是如何实现的,而正好看到了这里的一篇讲解这方面的文章 ...

  9. Mysql 存储过程使用游标

    -- 完整例子 CREATE PROCEDURE test BEGIN -- 定义参数    DECLARE _id INT; -- 定义游标    DECLARE no_more_products ...

  10. httpclient4 模拟访问网页 模拟登录 简单例子

    JAVA后台模拟登录一个网站,获得一定权限后进一步操作. 所用的工具: Apache HttpComponents client 4.3版本 以下为代码: import org.apache.http ...