蓝桥杯 K好数(Java)
越来越觉得自己菜,一道简单的动态规划写不出来,题解也是看了很多份才看懂了,所以尽量以图表的方式写了题解,希望我的题解能帮到其他人吧。(;´Д`)
首先是题目:
输入描述:
输入包含两个正整数,K和L。
输入样例:
4 2
输出描述:
输出一个整数,表示答案对1000000007取模后的值。
输出样例:
7
1.首先我们初始化一个L行K列的数组(题目输入为4 2,所以先以4进制为例子,位数不限制)
用于表示
在L位的情况下,最后一位为K的符合条件的数字的个数
2.
四进制的情况下每一位能取的值为0到3
因为不能以0作为第一位数(因为后面计算两位数时出现00,02,03这种并不是两位数)
所以以0为第一位的有0种,以1为第一位的有1种,以2为第一位的有1种,以3为第一位的有1种,结果为0,1,1,1
3.两位数的以0结尾的数有20和30,因为10相邻不满足条件,
所以此时以0结尾的数的数量为2,
也就是在第二位为0的情况下,把第一位除了等于1以外的所有可能相加
(虽然把00这种不应该有的可能也加上去了,但是由于它本来就是0,所以不会有影响)
4.两位数的以1结尾的数有11和31,因为21相邻不满足条件,
所以此时以1结尾的数的数量为2,
也就是在第二位为1的情况下,把第一位除了等于0和2以外的所有可能相加
5.同理得到两位数的以0,1,2,3结尾的所有可能
6.接下来是三位数,
三位数的以0结尾的数只要考虑第2,第3位,也就是最后两位不会出现相邻的情况就可以了
所以和第三步同样在第三位为0的情况下,把第二位除了等于1以外的所有可能相加
7.最后是完整的表格
8.最后把第四行的14,10,8,15加起来就得到在4进制的情况下,四位数的K好数的数量(把第二行的加起来就是题目样例4 2的结果7)
接下来是代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Kgood {
public static BigInteger getNumberOfKGood(int l, int k) {
// 这是第一步定义的表格的二维数组
int [][] array = new int[l][k];
// 这是第二步的初始化,将一位的情况的结果设置为0,1,1,1......
for (int i = 1; i < k; i++) {
array[0][i] = 1;
}
// i代表表格的行,也就是位数
// j代表表格的列,也就是可能取的进制数
for (int i = 1; i < l; i++) {
for (int j = 0; j < k; j++) {
// 这里为第三步,也就是把这一位所能取的值遍历,并与上一位j做比较,筛选掉相邻的可能
for (int j2 = 0; j2 < k; j2++) {
if ((j != j2 + 1) && (j != j2 - 1)) {
// 按题目要求取模
array[i][j] = (array[i][j] + array[i-1][j2]) % 1000000007;
}
}
}
}
// 最后一步的取值,把最后一行的值加起来就是了
// 因为数据挺大的,所以遇事不决用大数[滑稽]
BigInteger sum = new BigInteger("0");
for (int i = 0; i < k; i++) {
sum = sum.add(new BigInteger(Integer.toString(array[l - 1][i])));
}
return sum.mod(new BigInteger("1000000007"));
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int l = sc.nextInt();
BigInteger sum = getNumberOfKGood(l, k);
System.out.println(sum);
sc.close();
}
}
蓝桥杯 K好数(Java)的更多相关文章
- 蓝桥杯 K好数
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.3 ...
- 动态规划专题 多阶段决策问题 蓝桥杯 K好数
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...
- 蓝桥杯 K好数(dp)
Description 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.1 ...
- 算法笔记_052:蓝桥杯练习Multithreading(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 现有如下一个算法: repeat ni times yi := y y := yi+1 end repeat 令n[1]为你需要算加法的第 ...
- java实现第三届蓝桥杯方块填数
方块填数 "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6的小格被分为6个部 ...
- java实现第七届蓝桥杯凑平方数
凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的. 比如:0, 36, 5948721 再比如: 1098524736 1, 25, 6390784 0, 4, 28 ...
- java实现第七届蓝桥杯七星填数
七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...
- java实现第六届蓝桥杯五星填数
五星填数 如[图1.png]的五星图案节点填上数字:1~12,除去7和11. 要求每条直线上数字和相等. 如图就是恰当的填法. 请你利用计算机搜索所有可能的填法有多少种. 注意:旋转或镜像后相同的算同 ...
- java实现第七届蓝桥杯方格填数
方格填数 题目描述 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显示 ...
随机推荐
- java 初探-猜数字
学习Java而编写的猜数字的程序代码. /** * */ package org.literal.test; import java.util.Scanner; /** * @author liter ...
- 带你封装自己的MVP+Retrofit+RxJava2框架(一)
前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...
- Linux centos7.0 配置防火墙及开放端口
现在防火墙有两种服务1.service firewalld 2.service iptables 一.就firewalld来说查看开放的端口 netstat -anp 查询防火墙状态 servi ...
- 前端每日实战:31# 视频演示如何利用 CSS 的动画原理,创作一个乒乓球对打动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/rvgLzK 可交互视频教程 此视频 ...
- sublime text3 搭建c++/c环境
sublime搭建的c++/c使用很方便,实用性很强,自己阅览了无数的博客,csdn,博客园的都看了,最后还是自己摸索着搭建成功了,如果觉得还不错请给个评论谢谢.(提前声明本人专利不允许转载!!!!) ...
- angular -——组件样式修改不成功
angular组件样式修改不成功! 自己定义的css可以成功 组件的不行 style在模板字符串里 直接没有 class 是显示的 但是样式不生效 加上面 即可,为什么?我也不太清楚.有知道答案的请回 ...
- 最简单易懂的实现CRC16校验
public String getCRC16(byte[] bytes) { //CRC寄存器全为1 int CRC = 0x0000ffff; //多项式校验值 int POLYNOMIAL = 0 ...
- 027.掌握Service-Ingress使用
一 Ingress简介 1.1 Ingress 通常Service的表现形式为IP:Port,即工作在TCP/IP层. 对于基于HTTP的服务来说,不同的URL地址经常对应到不同的后端服务(RS)或者 ...
- Redux 架构理解
Redux 是一种前端“架构模式”,是 Flux 架构的一种变种,用来提供可预测的状态管理.虽然经常和 React 一起被提及,但是 Redux 却不仅仅只能用于 React,还可以将其运用到其他前端 ...
- 多个文件名大小写不同,是因为运行代码是大写E,用vscode运行的是小写e,解决方案:手动npm run dev #There are multiple modules with names that only differ in casing.
多个文件名大小写不同,是因为运行代码是大写E,用vscode运行的是小写e,解决方案:手动npm run dev #There are multiple modules with names that ...