社区讨论

蒟蒻求助,0分

P1308[NOIP 2011 普及组] 统计单词数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lrvvbqpk
此快照首次捕获于
2024/01/27 17:27
2 年前
此快照最后确认于
2024/01/27 19:33
2 年前
查看原帖
CPP
#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;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...