Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
51534 | AK2022071346 | 最优子序列 | C++ | 解答错误 | 40 | 297 MS | 784 KB | 943 | 2022-07-13 11:51:11 |
#include<string> #include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,k,tp,f[3501],cnt,dp[4501][31],ln[3501],len,ans; string s; bool l[3501]; inline int mx(int a,int b){return a<b?b:a;} int main() { scanf("%d%d%d",&n,&k,&tp); cin>>s; for(int i=0;i<n;i++) { len++; if(i<n-1) { if(s[i]==s[i+1]) continue; } l[i]=1; if(!f[s[i]-'a'])f[s[i]-'a']=++cnt; ln[i]=len; len=0; } for(int i=0;i<n;i++) { if(!l[i])continue; int ff=f[s[i]-'a']; for(int j=0;j<(1<<cnt);j++) { if(j&(1<<(ff-1)))dp[j][ff]+=ln[i]; } for(int j=0;j<(1<<cnt);j++) { if(!(j&(1<<(ff-1)))) { for(int k=1;k<=cnt;k++) { if(!(j&(1<<(k-1))))continue; dp[j+(1<<(ff-1))][ff]=mx(dp[j][k]+ln[i],dp[j+(1<<(ff-1))][ff]); } } } } for(int i=0;i<(1<<cnt);i++) for(int j=1;j<=cnt;j++)ans=mx(ans,dp[i][j]); printf("%d",ans); return 0; }