[luoguP1026] 统计单词个数(DP)

传送门

题解

#include <cstdio>
#include <cstring>
#define max(x, y) ((x) > (y) ? (x) : (y))

int p, k, w, n, m, num;
char s[2001], a[7][2001];
int f[2001][41], len[7], d[2001];
bool flag;

int main()
{
    scanf("%d %d", &p, &m);
    for(int i = 1; i <= p; i++) scanf("%s", s + 20 * (i - 1) + 1);
    n = strlen(s + 1);
    scanf("%d", &num);
    for(int i = 1; i <= num; i++)
    {
        scanf("%s", a[i] + 1);
        len[i] = strlen(a[i] + 1);
    }
    memset(d, 127 / 3, sizeof(d));
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= num; j++)
        {
            if(i + len[j] - 1 > n || d[i] <= i + len[j] - 1) continue;
            flag = 0;
            for(int k = 1; k <= len[j]; k++)
                if(s[i + k - 1] != a[j][k])
                {
                    flag = 1;
                    break;
                }    
            if(!flag) d[i] = i + len[j] - 1; 
        }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            w = 0;
            for(int k = i; k >= j; k--)
            {
                if(d[k] <= i) w++;
                f[i][j] = max(f[i][j], f[k - 1][j - 1] + w);
            }
        }
    printf("%d", f[n][m]);
    return 0;
}

  

原文地址:https://www.cnblogs.com/zhenghaotian/p/7057827.html