1 条题解

  • 0
    @ 2025-8-24 21:35:34

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Mr_QwQ
    **

    搬运于2025-08-24 21:35:34,当前版本为作者最后更新于2017-02-12 17:39:59,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    啊啊啊,终于AC了……心好累……

    这题很明显是DP,因为它满足DP的两个性质——最优子结构、无后效性。(不知道这些的请回去看看DP吧)(划掉)

    状态很明显:考虑文本串前i个字符匹配模板前j个字符的匹配数。

    转移也很明显:当第i个字符是文本中的第j个,dp[i][j]=dp[i-1][j]+dp[i-1][j-1],其他dp[i][j]=dp[i-1][j](因为这个字符对于匹配没有用嘛)

    现在只差一个:边界。

    //众:我倒!!!

    边界是什么呢?我们知道dp[0][i]=0,但dp[i][0]是几呢?在文本中匹配一个空串?晕。。。

    看看样例吧:

    HhEeLlLlOoWwOoRrLlDd

    现在,我们在文本前加一个奇gay的字符,比如♂【滑稽】

    那么文本就变成了:

    ♂HhEeLlLlOoWwOoRrLlDd

    让我们把♂看成模板(即“helloworld”)的第0个字符。这个时候,边界明显了吧。。。

    还有一个细节:模板中有重复字符,因此要逆序循环,不然会WA(考虑一下“hhhhhhh”这个模板就明白了)

    代码:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    const int mod=1000000007;
    int main()
    {
        long long dp[11]={1};
        char c,hello[20]="?helloworld";
        while((c=getchar())!=EOF)
        {
            for(int i=10;i>=1;i--)if(c==hello[i]||c+32==hello[i])dp[i]=(dp[i-1]+dp[i])%mod;
        }
        cout<<dp[10];
        return 0;
    }
    
    • 1

    信息

    ID
    2461
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者