zoukankan      html  css  js  c++  java
  • 算法---ALGO-3 Java K好数 蓝桥杯

    package Main;
    
    
    import java.io.InputStream;
    import java.util.Scanner;
    public class Main 
    { 
        public static long constant = 1000000007;
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            long k = in.nextLong();
            long l = in.nextLong();
            //dp[i][j] = num  表示第i位的数字j有num种可能性
            long dp[][] = new long[103][103];   //二维数组用于存放所有可能的个数
            //初始化
            for(int i=0;i<k;i++)
            {
                dp[1][i] = 1;
            }
            for(int i=2;i<=l;i++)
            {
                for(int j=0;j<k;j++)
                {
                    for(int f=0;f<k;f++)
                    {
                        if((f-j!=-1)&&(f-j!=1))
                        {
                            dp[i][j] += dp[i-1][f];
                            dp[i][j] = dp[i][j]%constant;
                        }
                    }
                }
            }
            long result = 0;
            //从1开始,去掉起始以0开头的部分
            for(int i=1;i<k;i++)
            {
                result += dp[(int) l][i];
                result = result%constant;
            }
            System.out.println(result);
        }
        
    }
    问题描述

          如果一个自然数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。

    解决思路:

      本题所说的K进制表示中任意的相邻的两位都不是相邻的数字,是指K进制的数字使用0~k-1的数字组成该自然数,即4进制数:只能包含0,1,2三个数。同时对于相邻两位不是相邻的数字是指2,3相邻所以不能出现23这个数。

      该问题采用动态规划的方法,通过部分解的方式层层递进,首先求出K进制的1位数有几种可能,进而得出2位数的几种可能,依次得出结果。本次中采用数组dp[][]用于存储计算的数,dp[i][j] = num  表示第i位的数字j有num种可能性。

    步骤:

    step1:首先初始化,将第一行的从0开始到K-1列填充数字1,代表有1种可能性

    step2:其次,三层循环嵌套,外面两层循环代表行列数,注意:其中行从2开始,最内一行从0到k-1遍历,指带在该范围内,出现该数字的几种可能性

    step3:动态规划的核心方程为:

    dp[i][j] += dp[i-1][f];
    dp[i][j] = dp[i][j]%constant;

    边求解边求模,否则最后可能因数字太大出错。

  • 相关阅读:
    zbb20181207 springboot @ConfigurationProperties使用
    zbb20181206 logback,lombok 默认日志logback配置解析
    Spring Boot (8) 全局异常处理
    Spring Boot (7) JdbcTemplate访问数据库
    Spring Boot (6) Spring Data JPA
    Spring Boot (4) 静态页面和Thymeleaf模板
    Spring Boot (3) 热部署devtools
    Spring Boot (2) Restful风格接口
    Spring Boot (1) 构建第一个Spring Boot工程
    idea使用maven搭建ssm框架实现登陆商品增删改查
  • 原文地址:https://www.cnblogs.com/liuhui5599/p/8603464.html
Copyright © 2011-2022 走看看