蒟蒻求助,0分
查看原帖
蒟蒻求助,0分
1169273
xiao_tuan_zi楼主2024/1/27 17:26
#include<cstdio>
#include<iostream>
using namespace std;
int p,k,n,m,sum[210][210],f[210][50];
string s,a[10];
bool check(int l,int r) {
    string x = s.substr(l,r - l + 1);
    for(int i = 1;i <= n; i++) if(!x.find(a[i])) return true;
    return false;
}
void inin() {
    string ch;
    s += '0';
    scanf("%d%d",&p,&k);
    for(int i = 1;i <= p; i++) {
        cin >> ch;
        s += ch;
    }
    scanf("%d",&n); m = s.length() - 1;
    for(int i = 1;i <= n; i++) cin >> a[i];
    for(int i = m;i >= 1; i--)
        for(int j = i;j >= 1; j--) {
            sum[j][i] = sum[j+1][i];
            if(check(j,i)) sum[j][i]++;
        }
}
void dp() {
    f[0][0] = 0;
    for(int i = 1;i <= k; i++) f[i][i] = f[i-1][i-1] + sum[i][i];
    for(int i = 1;i <= m; i++) f[i][1] = sum[1][i];
    for(int i = 1;i <= m; i++)
        for(int j = 1;j <= k && j < i; j++)
            for(int l = j;l < i; l++)
                f[i][j] = max(f[i][j],f[l][j-1] + sum[l+1][i]);
    printf("%d\n",f[m][k]);
}
int main()
{
    inin();
    dp();
    return 0;
}
2024/1/27 17:26
加载中...