1 条题解

  • 0
    @ 2021-11-19 9:03:16

    看着是一个简单的背包,但并不简单。

    Sample false solution 1

    直接将所有串排序,取前 kk 个接起来。

    显然错误,因为会有长度影响字典序。

    数据:

    input

    2 2
    ba
    b
    

    output

    bab
    

    wrong output

    bba
    

    Sample false solution 2

    排序方法换一下,比较两个数哪个数放前面更优。

    错误,字典序不一定就最小。

    数据:

    input

    2 1
    ba
    b
    

    output

    b
    

    wrong output

    ba
    

    Sample false solution 3

    考虑动态规划。

    先排序,然后背包处理。

    错误,字典序是从前向后比较,前面的最优字符串的长度会影响后面的字典序,所以会有问题

    数据:

    input

    4 3
    bbaba
    bba
    b
    b
    

    output

    bbababb
    

    wrong output

    bbababbab
    

    Correct solution

    考虑前面的选择会影响后面的比较,但后面的并不会影响前面的,所以把第 33 中做法直接倒着做就可以了。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=55;
    int n,k;
    string st[N],f[N];
    int main(){
        std::ios::sync_with_stdio(false);
        cin>>n>>k;
        for(int i=1;i<=n;i++)cin>>st[i];
        sort(st+1,st+n+1,[](string a,string b){return a+b<b+a;});
        for(int i=1;i<=k;i++)f[i]+=char(255);
        for(int i=n;i;i--){
            for(int j=min(n-i+1,k);j;j--)f[j]=min(f[j],st[i]+f[j-1]);
        }
        cout<<f[k];
    }
    
    • 1

    信息

    ID
    14
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者