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

posted @   纯粹的  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示