#(|テンプレート|アルゴリズム+文字列の部分DP)P1026は、単語の数を数える(増加+ /地方の選挙 - )

タイトル説明

以上の長さを与えられた200ことである2 0 文字列小文字英文字0(慣例;各行の文字列20は、2 0文字入力モード、及び各行が一定であることを保証するために、20 2 0)。これは、文字列をに分割されている必要K K部品(1 <K \ル40 。1 < K 。4 0)、および単語の最大数は、それぞれに含まれる単語の総数(それぞれが含まれるが、部分的に重なっていてもよい足し。によって選出します単語の後の最初の文字は、例えば文字列のために、再利用することはできません。このTのH I sが中に含めることができる。このT H I SとIS I 、S、の選択このTのH 私はその後、sが含まれていないことができTH T Hを)。

与えられた単語超えない6つの辞書に6言葉を。

要求出力の最大数。

入力形式

各グループの最初の行は、2つの2つの正の整数(P、K P K)

p個の行およびpは、文字列を表し、K K分割表すK K部品。

P- Pラインは、各ラインが有する20の2 0文字。

再度そこ。1 正の整数S Sは、辞書の単語の数です。1 \ Sル\ル。6 。1 S 6)

次のS Sラインそれぞれが持っている1 単語を。

出力フォーマット

1 それぞれのテストデータの各セットに対応する整数。

サンプル入力と出力

入力#1
3 1 
thisisabookyouareaoh 
4が
ある
OK 
SAB
出力#1
7

説明/ヒント

この/ isabookyoua / reaoh

予選:

使用方法の文字列型でC ++:

1.x.substr(LEN)は長さlenの文字列で始まる文字列の添字xを返します。

2.s.lenth()は、文字列sの長さを計算します

3.s.find(a)は、Aは、Sにおける添字aの文字列s返される最初の文字のサブタイプである場合、文字列s(かストリングSの即ち決意)内の文字列を見つけます。 (Sは文字の配列に相当するので)

4.詳細な使用します。https://blog.csdn.net/qq_37941471/article/details/82107077

https://www.cnblogs.com/Draymonder/p/6944479.html

https://blog.csdn.net/Alexander_1314/article/details/82192687

アイデアを考えてみましょう:

提供DP [I] [j]は1-表す> I jがセグメント内の単語の最大数に分割されています

最初のオリジナルエネルギー統計の任意の2点間の単語の、前の文字列数、及びその後列挙相、二相及び列挙の最外端:サブセグメントの数、そのセグメントを注意限界がある:ステージの数よりも少ないですこれは、文字の数に等しく、最大値未満

セグメントの数、1-から最も内側の列挙ブレークポイントの範囲> I-1、DPのセクションを可能にします

状態遷移式:DP [I] [J] = MAX(DP [I]、[J]、DP [K] [J-1] +和[K + 1] [I])。

ACコード:

書式#include <iostreamの>
の#include <アルゴリズム>
書式#include <cstdioを>
する#include <CStringの>
の#include <文字列>
std名前空間を使用しました。
int型のP、K、M、N。
int型のDP [1200] [1200];
int型の合計[1200] [1200];
インラインint型リード()
{
チャーCH。
一方、((CH = GETCHAR())< '0' || CH> '9')。
int型のres = CH-48;
一方、((CH = GETCHAR())> = '0' && CH <= '9')
のRES =のRES * 10 + CH-48。
解像度を返します。
}
文字列s [10]。
BOOLチェック(int型のL、R INT)
{
ストリングX = s.substr(L、R-L + 1)。
以下のために(iは++; iが<= N I = 1 INT)
(x.find([I])== 0)の場合に
trueを返します。
falseを返します。




K =リード()。
文字列トン。
S + = '0';
以下のために(; I <= P iは++ i = 1からINT)
{
CIN >> T。
S + = T。
}
N =)(読み取ります。
M = s.length() - 1;
以下のために(INT i = 1; iが= <N; iは++)
CIN >> [I]。
ための式(I = mをint型、I> = 1; i--)
のための(int型J = I; J> = 1; j--)
{
和[J] [i]は=和[J + 1] [i]は;
もし((j、i)に対してチェック)
の和[j]を[I] ++;
}
}
ボイド作業を()
{
ため(INT i = 1; iは= Kを<; iは++)
DPを[I] [i]はDPを= [I-1]を[I-1] +和[I] [I]。
以下のために(INT I = 1; I <= M; iは++)
DP [I] [1] =和[1]〜[I]。
(; I <= M I ++ I = 1 INT)のため
のために(J ++ INT J = 1; J <= K && J <= I)
{
ため(INT Q = J; Q <I、Q ++)
DP [I] [ J] = MAX(DP [I] [J]、
}

COUT << DP [M] [K]。
}
int型のmain()
{
INIT()。
作業();
0を返します。
}

おすすめ

転載: www.cnblogs.com/little-cute-hjr/p/11423060.html