60分求助!
查看原帖
60分求助!
401504
Taro2020楼主2022/3/15 10:15
#include <bits/stdc++.h>
using namespace std;

int t,k;
int n,len;
string s;
string str[10005];

int sum[10005][10005];

bool check(int l,int r)
{
    string s1 = s.substr(l, r - l + 1);
    for(int i = 1;i <= n;i++)
    {
        if(s1.find(str[i]) == 0)
        {
            return true;
        }
    }
    return false;
}

void input()
{
    cin >> t >> k;

    string ch;
    for(int i = 1;i <= t;i++)
    {
        cin >> ch;
        s += ch;
    }

    cin >> n;

    len = s.length();
    
    for(int i = 1;i <= n;i++)
    {
        cin >> str[i];
    }

    for(int i = len;i > 0;i--)
    {
        for(int j = i;j > 0;j--)
        {
            sum[j][i] = sum[j + 1][i];
            if(check(j, i))
            {
                sum[j][i]++;
            }
        }
    }
}

int dp[10005][10005];

void work()
{
    for(int i = 0;i <= k;i++)
    {
        dp[i][i] = dp[i - 1][i - 1] + sum[i][i];
    }

    for(int i = 0;i < len;i++)
    {
        dp[i][1] = sum[1][i];
    }

    for(int i = 0;i < len;i++)
    {
        for(int j = 0;j <= k && j < i;j++)
        {
            for(int l = j;l < i;l++)
            {
                dp[i][j] = max(dp[i][j], dp[l][j - 1] + sum[l + 1][i]);
            }
        }
    }
    cout << dp[len - 1][k];
}


int main()
{
    input();
    work();
    return 0;
}
2022/3/15 10:15
加载中...