原題連結
題解
話說dalao們是怎麼做這麼快的??
問從含有字串的揹包中取出一些字串(每個揹包只能娶一個),問能拼湊出給定字串的最小代價
由於這裡的拼湊是有順序的,即如果b能拼上的是中間一塊,那麼a一定拼的是前邊一塊,這種拼湊讓人想到了揹包
這裡是字串的揹包,其實是一樣的,先判斷能不能放進去,如果能放進去,把當前結尾的字串的dp值更新
判斷能不能放進去用到了stl裡的substr
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string T;
string s[110][15];
ll A[110]={0};
ll dp[110]={1};
ll issuf(ll endpos,ll who,ll which)
{
string str=s[who][which];
ll sizes=str.size();
if(sizes-1>endpos)return 0;
if(T.substr(endpos-sizes+1,sizes)==str) return 1;
return 0;
}
int main()
{
cin>>T;
ll len=T.size();
ll n;
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>A[i];
for(ll j=1;j<=A[i];j++)
{
cin>>s[i][j];
}
}
for(ll i=1;i<=105;i++)dp[i]=2e17;
dp[0]=0;
for(ll i=1;i<=n;i++)
{
for(ll j=len;j>=1;j--)
{
for(ll k=1;k<=A[i];k++)
{
if(issuf(j-1,i,k)) dp[j]=min(dp[j-s[i][k].size()]+1,dp[j]);
}
}
}
cout<<(dp[len]==2e17f?-1:dp[len]);
return 0;
}