zoukankan      html  css  js  c++  java
  • 听课笔记--DP--Authentication Failed


    Authentication Failed

    https://www.codechef.com/problems/AUTHEN/

    从一个长为N+K的由小写字母组成的字符串中删去K个字符,

    可以得到多少种不同的字符串?

    输出答案减1

    N<=10000, K<=100

    样例输入:

    3

    2 1

    aaa

    3 1

    abcd

    4 2

    ababab

    样例输出:

    0

    3

    10

    方案的最小表示:

    abcb:计入答案

    abcb:不计入答案

    每种方案只在最早出现的位置计入答案


    f[i,j]表示前i个字符内去掉了j个字符,且第i个字符被保留,此时的方案数
    如果保留第i位,

    则上一个被保留的位与i之间不能有和第i位相同的字符
    否则就不是最小表示

    例:

    (假设正在算f[6,3])

    abcadc

    f[6,3]=f[5,3]+f[4,2]+f[3,1];

    此时在计算保留第六位,前面删去了3个;

    所以它可以直接由f[5][3](上一位保留第五位d,即第六位与第五位之间没有删去字符)转移来;

    也可以由f[4][2](上一位保留第四位a,中间删去d)转移来;

    还可以由f[3][1](上一位保留第三位c,中间删去两个字符a,d)转移来;

    那为什么不可以又f[2][0]转移来呢?答案是显然的,此时,我们是按题目要求(每种方案只在最早出现的位置计入答案)从左到右转移来的,当前面在枚举到第三位c时,已经有了abc或bc这一种状态。故:

    上一个被保留的位与i之间不能有和第i位相同的字符

    否则就不是最小表示


    首先,我们要预处理对于每个字符与它相同的字符的位置。

    然后在转移时难道要从那里开始一个个遍历吗?

    同时通过此图我们发现,我们只需维护斜着的前缀和,这样状态转移可以在O(1)内完成。

  • 相关阅读:
    Linux下如何从mysql数据库里导出导入数据
    安装好Pycharm后如何配置Python解释器简易教程
    Windows离线安装Python第三方库的方法
    时间输入框的测试方法
    doc转html
    pdf转png图片
    html转pdf
    html转pdf
    复习 注解反射
    Mybatis实现插入数据的时候将主键赋值给对象的两种方法
  • 原文地址:https://www.cnblogs.com/Rye-Catcher/p/8478849.html
Copyright © 2011-2022 走看看