zoukankan      html  css  js  c++  java
  • poj3267

    题意:问母串中至少去掉多少个字母才能是刚好由单词表中的一些单词连接而成的。

    分析:dp,f[i]表示母串从第i位起始的后缀所对应的最少去掉字母数。

    f[i]有两种选择f[i + 1] + 1或者f[i + num] + num - strlen(word[j])。其中num是从第i位开始匹配word[j]所需要的母串从i位起始的后缀的前缀的长度。

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    usingnamespace std;

    #define maxn 605
    #define maxl 305

    int n, m;
    char st[maxl], word[maxn][maxl];
    int f[maxl];

    int match(char*st1, char*st2)
    {
    if (st1[0] != st2[0])
    return0;
    int len = strlen(st2);
    int j =0;
    for (int i =0; i < len; i++)
    {
    while (st1[j] !='\0'&& st1[j] != st2[i])
    j
    ++;
    if (st1[j] =='\0')
    return0;
    j
    ++;
    }
    return j;
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    scanf("%d%d", &n, &m);
    scanf(
    "%s", st);
    int num;
    for (int i =0; i < n; i++)
    scanf(
    "%s", word[i]);
    f[m]
    =0;
    for (int i = m -1; i >=0; i--)
    {
    f[i]
    = f[i +1] +1;
    for (int j =0; j < n; j++)
    if (num = match(&st[i], word[j]))
    f[i]
    = min(f[i], int(num - strlen(word[j]) + f[i + num]));
    }
    printf(
    "%d\n", f[0]);
    return0;
    }
  • 相关阅读:
    模拟测试20190815(已更新)
    [JLOI2015]管道连接
    [BJWC2018]最长上升子序列
    [CQOI2012]局部极小值
    [HNOI2010]Bus 公交线路
    [BZOJ4903/CTSC2017]吉夫特
    [BZOJ3717/PA2014]Pakowanie
    [NOI2015]寿司晚宴
    [BZOJ4145/AMPPZ2014]The Prices
    [Usaco2013 Nov]No Change
  • 原文地址:https://www.cnblogs.com/rainydays/p/2096219.html
Copyright © 2011-2022 走看看