题意:给你一个长度为n的字符串,选择不同的k个子序列的最小花费,花费为n减去子序列长度
思路:
dp ,dp[i][j]代表以i结尾,长度为j的不同的子序列个数,注意去重,枚举前面如果末尾的单词一样就减去前面相同长度的贡献。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int md=1e9+7;
int a[20];
int Pow[20];
int len[110];
int dp[210][210];
signed main()
{
ios::sync_with_stdio(0);
int cost=0;
int n,k;
cin>>n>>k;
string s;
cin>>s;
s=' '+s;
dp[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
for(int k=0;k<i;k++)
dp[i][j]+=dp[k][j-1];
for(int k=1;k<i;k++)
if(s[k]==s[i])
dp[i][j]-=dp[k][j];
}
}
//cout<<dp[3][3]<<endl;
for(int i=n;i>=0;i--)
{
for(int j=0;j<=n;j++)
{
if(k>dp[j][i])
{
k-=dp[j][i];
cost+=dp[j][i]*(n-i);
}
else if(k<=dp[j][i])
{
cost+=k*(n-i);
cout<<cost<<endl;
return 0;
}
}
}
cout<<-1<<endl;
return 0;
}