1 条题解
-
0
看着是一个简单的背包,但并不简单。
Sample false solution 1
直接将所有串排序,取前 个接起来。
显然错误,因为会有长度影响字典序。
数据:
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
考虑前面的选择会影响后面的比较,但后面的并不会影响前面的,所以把第 中做法直接倒着做就可以了。
#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
- 上传者