Atcoder abc_344_D题 String Bags

Problem Statement

你最初有一个空字符串S。
此外,还有1,2,...,N个包,每个都包含一些字符串
第i个包包含Ai个字符串,Si1,Si2...SiAi

你将会重复几个步骤i=1,2...N:

  • 选择并执行两个操作之一
    • 付1元,从包i中选择一个字符串并将其添加到S的最后
    • 什么都不做

给定一个字符串T,找到能使最终的S等于T的最小金额
如果无法将S等于T,则输出-1

Constraints

  • T是由小写英文字母组成的字符串,长度为1~100(含100)
  • N是1~100之间的整数
  • Ai是1~10之间的整数
  • Sij是小写英文字母组成的字符串,长度为1~10(含10)

解题思路:

从不同的组中选取一些字符串组成字符串T,且有的组可以不选。如果是暴力搜索会超时,所以用类似分组背包的方法,只不过要找的是最小金额,即所取的数量尽可能少,属性是min,dp数组指的是前i层字符串S组成1~s.len的最小子串数量。

将数组dp初始化为-1,即可满足无法将S变成T的情况。

AC代码如下:

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
string T;
int n,a;
int main()
{
    cin>>T;
    vector<int>dp(T.size()+10,-1),dp2;
    cin>>n;
    dp[0]=0;
    for(int i=1;i<=n;i++){
        cin>>a;
        dp2 = dp;
        for(int j=1;j<=a;j++){
            string s;
            cin>>s;
            for(int k=0;k<T.size();k++){
                if(dp[k]!=-1){
                    if(T.substr(k,s.size())==s){
                        if(dp2[k+s.size()]==-1||dp2[k+s.size()]>dp[k]+1){
                            dp2[k+s.size()]=dp[k]+1;
                        }
                    }
                }
            }
        }
        dp = dp2;
    }
    cout<<dp[T.size()]<<endl;
    return 0;
}

易错点(WA32):

由于dp数组是一维的,所以在更新的过程中要注意区分本层的状态和上一层的状态。因此还需要一个数组dp2,用来更新新一层的状态,否则可能导致某一组加入了不止一个子串。

### AtCoder ABC229_A 目解析与代码实现 AtCoder Beginner Contest (ABC) 是一项面向初学者的编程竞赛,通常每道目都具有清晰的问描述以及适中的难度。对于 ABC229_A 的解决方案或代码实现,以下是详细的分析和解答。 #### 问概述 假设 ABC229_A 的问是关于字符串处理或者简单的算术运算(这是许多 A 类问的特点)。以下是一个通用的例子:给定两个整数 `A` 和 `B`,计算它们的总和并输出结果。 #### 解决方案说明 解决此类问的关键在于理解输入格式、数据范围以及如何高效地完成基本操作。Python 提供了简洁而强大的工具来快速解决问[^1]。 ```python import sys def solve(): input_data = sys.stdin.read() lines = input_data.splitlines() # 假设第一行为 A B 格式的输入 A, B = map(int, lines[0].split()) result = A + B print(result) if __name__ == "__main__": solve() ``` 上述代码展示了如何读取标准输入并将结果打印到标准输出。通过使用 `sys.stdin.read()` 方法可以一次性获取所有输入内容,并利用 Python 的内置函数进行必要的转换和计算。 #### 关键点解释 - **输入/输出管理**:在竞赛环境中,高效的 I/O 处理至关重要。上例中采用了 `sys.stdin.read()` 来替代传统的 `input()` 函数,从而提升性能。 - **错误预防**:确保变量类型正确无误,尤其是在涉及多种数据类型的混合运算时。 如果具体问涉及到 URL 编码解码,则可参考如下方法: ```python import urllib.parse encoded_url = 'https://atcoder.jp/contests/abc229/tasks/abc229_a' decoded_url = urllib.parse.unquote(encoded_url) print(decoded_url) # 输出原始URL地址 ``` 此部分适用于需要对特殊字符编码的情况,例如提交表单参数或其他网络请求场景下的预处理工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值