URAL1513. Lemon Tale(dp)

1513

这题好久之前就看过了,悲催的是当时看题解都没看懂,今天又看了看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 }
View Code

 

转载于:https://www.cnblogs.com/shangyu/p/3543115.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值