• 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
  • 相关阅读:
    C# WinForm判断Win7下程序是否以管理员身份运行
    C#设置文件(夹)权限
    验证字符串是否为有效的IP地址
    内存对齐
    C#线程启动时传入参数
    写字符串内容到文件
    Thread.Abort() Is Evil.
    如何优雅地控制线程状态
    C#读取文件,返回字符串形式的文件内容
    关于产生不重复随机数的算法 C#
  • 原文地址:https://www.cnblogs.com/shangyu/p/3543115.html
Copyright © 2020-2023  润新知