D - String Bags
题解
话说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;
}