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