Codeforces Round #494 (Div. 3) F. Abbreviation
Posted rfisher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #494 (Div. 3) F. Abbreviation相关的知识,希望对你有一定的参考价值。
题目大意
- 在一些字符串中找到几个(大于等于2个)不相交的区间,且这些区间都相等,即区间内字符串都相等。
解题思路
- 我们可以用递推的方式求出f[i][j]表示以i,j为结束,已经匹配了多长的字符串。
- 求出f之后,枚举区间,计算匹配次数,得出结果。
代码
#include <bits/stdc++.h>
using namespace std;
vector<string> a;
int n;
int dp[350][350];
int main()
{
int totl = 0; /*总长度*/
cin >> n;
for (int i = 0; i < n; i++) {
string t;
cin >> t;
a.push_back(t);
totl += t.size();
}
totl += n - 1;
// 计算dp
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (a[i] == a[j]) {
if (i == 0)
dp[i][j] = 1;
else
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else
dp[i][j] = 0;
}
}
int ans = totl;
for (int i = n - 1; i >= 0; i--) {
int sum = 0;
/*匹配长度为d*/
for (int d = 1; i - d >= 0; d++) {
sum += a[i - d + 1].size();
int cnt = 0; /*匹配次数*/
for (int j = i - d; j >= 0; ) {
if (dp[j][i] >= d) {
cnt++;
j -= d;
} else
j--;
}
if (cnt) {
cnt++; /*加上自己*/
int tmp = totl - cnt * sum + cnt;
if (tmp < ans)
ans = tmp;
}
}
}
cout << ans << endl;
return 0;
}
以上是关于Codeforces Round #494 (Div. 3) F. Abbreviation的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #494 (Div. 3)爆炸记
Codeforces Round #494 (Div. 3) F. Abbreviation
Codeforces Round #494 (Div. 3) D. Coins and Queries (贪心,数学)
Codeforces Round #494 (Div. 3) D. Coins and Queries (贪心,数学)