题目传送门
题目大意:
首先输入字符串T,然后输入N。
接下来的N行会输入一个整数A[i],表示后面有A[i]个字符串S[i][1],S[i][2],……S[i][A[i]]
可以花费1从S[i]中选一个字符串拼接到空串X的末尾,且每个S[i]中最多只能选择一个字符串或不选择任何字符串。输出最后X==T的最小花费(X!=T则输出-1)。
思路:
我们用 dp[i]
表示长度为i时最少花费数。
如果当前字符串是t的子串,且当前dp[i]没被更新过或者比加入这个字符串前的最小价值要大时,就更新dp[i]。dp的最后一项就是答案。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,a,dp[110];
string t,s[110];
int main(){
for(int i=1;i<=100;i++) dp[i]=-1;
dp[0]=0;
cin>>t>>n;
int l=t.size();
for(int i=1;i<=n;i++){
cin>>a;
for(int j=1;j<=a;j++) cin>>s[j];
for(int j=l;j>=1;j--){
for(int k=1;k<=a;k++){
int ls=s[k].size();
if (j-ls>=0&&t.substr(j-ls,ls)==s[k]&&dp[j-ls]!=-1){
int num=dp[j-ls]+1;
if(dp[j]==-1||dp[j]>num) dp[j]=num;
}
}
}
}
cout<<dp[l];
return 0;
}