算法练习 ->K好数

在这里插入图片描述

题目感觉比较难以理解,建议参考下面给出的两篇文章
动态规划思想用了一些吧
这道题还是很有难度的…
加油!



import java.util.*;

public class Main {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner scanner = new Scanner(System.in);
    int k=scanner.nextInt();
  int l=scanner.nextInt();
  
  System.out.println(Kgood(k, l));
  }

public static BigInteger Kgood(int k,int l) {
  BigInteger sum=new BigInteger("0");
  // 这是第一步定义的表格的二维数组
  int[][] a = new int[l][k];
  // 这是第二步的初始化,将一位的情况的结果设置为0,1,1,1......
  for(int i=1;i<k;i++) {
   a[0][i]=1;
  }
  // i代表表格的行,也就是位数
  // j代表表格的列,也就是可能取的进制数
  for(int i=1;i<l;i++) {
  for(int j=0;j<k;j++) {
    // 这里为第三步,也就是把这一位所能取的值遍历,并与上一位j做比较,筛选掉相邻的可能
    for(int j1=0;j1<k;j1++) {
    if(j!=j1+1&&j!=j1-1) {
      // 按题目要求取模
      a[i][j]=(a[i][j]+a[i-1][j1])%1000000007;
     }
         }
   }
  }
  // 最后一步的取值,把最后一行的值加起来就是了
  for(int i=0;i<k;i++) {
   sum=sum.add(new BigInteger(Integer.toString(a[l-1][i])));
  }
  return sum.mod(new BigInteger("1000000007"));
 }
}

参考文章:
https://blog.csdn.net/qq_41714549/article/details/87435089
https://www.cnblogs.com/fatmanhappycode/p/12231203.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值