D - String Bags

纯粹的發表於2024-03-10

原題連結

題解

話說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;
}

相關文章