actoder abc 344 51 D - String Bags(分组背包)
前情提要
本来太菜了,上来就用的爆搜,剪枝,也是直接T了9个样例
思路
k组字符串,每组可以选一个或者不选,典型的分组背包问题
代码
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N = 110;
int f[N][N];
int main() {
string t;
cin >> t;
int len = t.size();
int n;
cin >> n;
memset(f, 0x3f, sizeof f);
f[0][0] = 0;
for (int i = 1; i <= n; i++) {
int k;
cin >> k;
vector<string> s(k);
for (int j = 0; j < k; j++) cin >> s[j];
for (int j = 0; j <= len; j++) f[i][j] = f[i - 1][j];//不选择字符串
for (int j = 0; j < k; j++) {
int tmp = len - s[j].size();
for (int l = 0; l <= tmp; l++)
if (f[i - 1][l] < 1e9 && t.substr(l, s[j].size()) == s[j])
f[i][l + s[j].size()] = min(f[i][l + s[j].size()], f[i - 1][l] + 1);//选择字符串
}
}
if (f[n][len] > 1e9) cout << -1 << endl;
else cout << f[n][len] << endl;
return 0;
}