Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
51705 | wssdr | 最优子序列 | C++ | 运行出错 | 30 | 44 MS | 72668 KB | 1058 | 2022-07-13 13:18:33 |
#include<bits/stdc++.h> #define N 2005 using namespace std; int n,k,tp,dp[N][1<<12][12]; vector <int> J[1<<12]; int s[N],ans; int main(){ scanf("%d%d%d",&n,&k,&tp); for(int i(1);i<=n;++i){ char c(getchar()); while(c<'a'||c>'z') c=getchar(); s[i]=c-'a'; } for(int S(0);S<(1<<k);++S) for(int a(S),j(S&(-S));a;a&=(a-1),j=(a&(-a))){ int x(1),cnt(0);while(x^j)x<<=1,++cnt; J[S].push_back(cnt); } for(int i(1);i<=n;++i) for(int S(0),x;S<(1<<k);++S){ x=S|(1<<s[i]); if(S^x) for(int a(0),j;a<J[S].size();++a){ j=J[S][a]; if((S|(1<<j))^S) continue; if(dp[i-1][S][j]+1>dp[i][x][s[i]]) dp[i][x][s[i]]=dp[i-1][S][j]+1; } else if(dp[i-1][S][s[i]]+1>dp[i][x][s[i]]) dp[i][x][s[i]]=dp[i-1][S][s[i]]+1; for(int a(0),j;a<J[S].size();++a){ j=J[S][a]; if(j==s[i]||((S|(1<<j))^S)) continue; dp[i][S][j]=dp[i-1][S][j]; } } for(int S(0);S<(1<<k);++S) for(int j(0);j<k;++j) if(dp[n][S][j]>ans) ans=dp[n][S][j]; printf("%d\n",ans); return 0; }