这题好久之前就看过了,悲催的是当时看题解都没看懂,今天又看了看so easy...
n个B里不能出现超过连续k个L的情况 一维递推就可以 两种情况 1、dp[i] += dp[i-1] 在i-1的串后面直接加一个B 2、dp[i]+=dp[i-2]+dp[i-3]+...+dp[i-k-1] 这部分的意思是在串后面补连续1个L 2个L 3个L。。K个L的情况 那补一个L的情况要取决于dp[i-1]里面最后一位为B的个数 正好为dp[i-2],依次可做。
1 import java.text.*; 2 import java.io.*; 3 import java.util.*; 4 import java.math.*; 5 import java.applet.*; 6 public class Lemon { 7 public static void main(String args[]) 8 { 9 Scanner cin = new Scanner(System.in); 10 BigInteger dp[] = new BigInteger[10010]; 11 BigInteger s[] = new BigInteger[10010]; 12 int i,j,n,k; 13 n = cin.nextInt(); 14 k = cin.nextInt(); 15 for(i = 0; i <= n ; i++) 16 dp[i] = s[i] = BigInteger.valueOf(0); 17 dp[0] = s[0] = BigInteger.valueOf(1); 18 if(k==0) 19 dp[1] = BigInteger.valueOf(1); 20 else 21 dp[1] = BigInteger.valueOf(2); 22 s[1] = s[0].add(dp[1]); 23 for(i = 2; i <= n ; i++) 24 { 25 dp[i] = dp[i].add(dp[i-1]); 26 BigInteger ss ; 27 if(i-k-2>=0) 28 ss = s[i-2].subtract(s[i-k-2]); 29 else 30 ss = s[i-2]; 31 if(k>=i) dp[i] = dp[i].add(BigInteger.valueOf(1)); 32 dp[i] = dp[i].add(ss); 33 s[i] = s[i-1].add(dp[i]); 34 35 } 36 System.out.println(dp[n]); 37 } 38 39 }