Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
51556 lzqy_ 最优子序列 C++ 运行超时 50 1000 MS 23316 KB 2275 2022-07-13 11:52:26

Tests(10/20):


#include<bits/stdc++.h> using namespace std; const int maxn=3010; const int maxs=4110; const int maxk=15; int read(){ char c=getchar(); for(;!(c>='a'&&c<='z');c=getchar()); return c-'a'; } struct St{ int len; int col[maxk],cnt[maxk]; }g[2][maxs][maxk]; int f[2][maxs][maxk]; int n,m,typ,a[maxn],aa[maxn]; int main(){ scanf("%d%d%d",&n,&m,&typ); for(int i=1;i<=n;i++) aa[i]=read(); for(int i=1;i<=n;i++) a[i]=aa[n-i+1]; int state=(1<<m); if(typ){ for(int i=1;i<=n;i++){ memset(f[i&1],0,sizeof(f[i&1])); for(int j=0;j<state;j++){ if(j&(1<<a[i])){ if(f[i&1^1][j][a[i]]+1>f[i&1][j][a[i]]) f[i&1][j][a[i]]=f[i&1^1][j][a[i]]+1,g[i&1][j][a[i]]=g[i&1^1][j][a[i]],g[i&1][j][a[i]].cnt[g[i&1][j][a[i]].len]++; } int id=-1; for(int k=0;k<m;k++){ if(!(j&(1<<a[i]))&&f[i&1^1][j][k]+1>f[i&1][j|(1<<a[i])][a[i]]) f[i&1][j|(1<<a[i])][a[i]]=f[i&1^1][j][k]+1,id=k; if(f[i&1^1][j][k]>f[i&1][j][k]) f[i&1][j][k]=f[i&1^1][j][k],g[i&1][j][k]=g[i&1^1][j][k]; } St &tmp=g[i&1][j|(1<<a[i])][a[i]]; if(!(j&(1<<a[i]))&&~id)tmp=g[i&1^1][j][id],tmp.col[++tmp.len]=a[i],tmp.cnt[tmp.len]=1; } } } else{ for(int i=1;i<=n;i++){ memset(f[i&1],0,sizeof(f[i&1])); for(int j=0;j<state;j++){ if(j&(1<<a[i])){ if(f[i&1^1][j][a[i]]+1>f[i&1][j][a[i]]) f[i&1][j][a[i]]=f[i&1^1][j][a[i]]+1/*,g[i&1][j][a[i]]=g[i&1^1][j][a[i]],g[i&1][j][a[i]].cnt[g[i&1][j][a[i]].len]++*/; } int id=-1; for(int k=0;k<m;k++){ if(!(j&(1<<a[i]))&&f[i&1^1][j][k]+1>f[i&1][j|(1<<a[i])][a[i]]) f[i&1][j|(1<<a[i])][a[i]]=f[i&1^1][j][k]+1/*,id=k*/; if(f[i&1^1][j][k]>f[i&1][j][k]) f[i&1][j][k]=f[i&1^1][j][k]/*,g[i&1][j][k]=g[i&1^1][j][k]*/; } // St &tmp=g[i&1][j|(1<<a[i])][a[i]]; // if(!(j&(1<<a[i]))&&~id)tmp=g[i&1^1][j][id],tmp.col[++tmp.len]=a[i],tmp.cnt[tmp.len]=1; } } } int ans=0,id1,id2; for(int k=0;k<m;k++) for(int j=0;j<state;j++) if(f[n&1][j][k]>ans) ans=f[n&1][j][k],id1=j,id2=k; printf("%d\n",ans); if(typ){ for(int i=g[n&1][id1][id2].len;i;i--) for(int j=1;j<=g[n&1][id1][id2].cnt[i];j++) printf("%c",g[n&1][id1][id2].col[i]+'a'); printf("\n"); } return 0; }


测评信息: