垃圾题……照样处理一发区间[i,j]有多少单词然后枚举区间起点i转移就行了。

 

题目描述

给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1<k<=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。

单词在给出的一个不超过6个单词的字典中。

要求输出最大的个数。

输入输出格式

输入格式:

每组的第一行有二个正整数(p,k)

p表示字串的行数;

k表示分为k个部分。

接下来的p行,每行均有20个字符。

再接下来有一个正整数s,表示字典中单词个数。(1<=s<=6)

接下来的s行,每行均有一个单词。

输出格式:

一个整数,分别对应每组测试数据的相应结果。

提供一组卡了我好久的数据,注意区间[i,j]的长度。。。

Testdata.in

10 4
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
1
aaaaa

Testdata.out

193

比分割字串稍难了一点……主要难在倒推k[i][j] ([i,j]有多少单词),写个模拟就行了吧大概……

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<iterator>
using namespace std;

int p,x,numd,diclen[10]={0};
char sq[210]={0},dic[10][210]={0},cachex[210]={0};
int d[210][210]={0},f[210][45]={0};

bool match(int sqpos,int dorder)
{
    for (int i=0;i<=diclen[dorder];i++)
    {
        if (sq[sqpos+i]!=dic[dorder][i]) return false;
    }
    return true;
}

int main()
{
    cin>>p>>x;
    for (int i=0;i<p;i++)
    {
        cin>>cachex;
        memcpy(sq+1+i*20,cachex,20);
    }
    cin>>numd;
    for (int i=1;i<=numd;i++)
    {
        int pos=0; cin>>cachex;
        for (int j=0;j<=210;j++)
        {
            if (cachex[j]>='a' && cachex[j]<='z') dic[i][pos++]=cachex[j];
            else break;
        }
        diclen[i]=pos-1;
    }
    p*=20;

    for (int j=p;j>=1;j--)
        for (int i=j;i>=1;i--)
        {
            d[i][j]=d[i+1][j];
            for (int k=1;k<=numd;k++) if ((sq[i]==dic[k][0]) && ((j-i+1)>=diclen[k]+1) && match(i,k))
            {
                d[i][j]=d[i+1][j]+1;
                break;
            }
        }
    
    for (int i=1;i<=p;i++) f[i][1]=d[1][i];
    
    for (int i=1;i<=p;i++)
        for (int k=1;k<=x;k++)
            for (int j=k;j<=i-1;j++)
                f[i][k]=max(f[i][k],f[j][k-1]+d[j+1][i]);
    cout<<f[p][x]<<endl;
    return 0;

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注