题目描述:
算法标签:dp
思路:
我们可以贪心的找每一位,每一次在当前可行集合的超集中贪心选择出下一位最优的字符是什么,在枚举一遍记录下所有可行方案。
以下代码:
#include<bits/stdc++.h> #define il inline #define _(d) while(d(isdigit(ch=getchar()))) using namespace std; const int N=5e3+5; char s[N],res[N]; int n,t;bool f[N][N],vis[N]; il int read(){ int x,f=1;char ch; _(!)ch=='-'?f=-1:f;x=ch^48; _()x=(x<<1)+(x<<3)+(ch^48); return f*x; } int main() { scanf(" %s",s+1); n=strlen(s+1); while((1<<(t+1))<=n)t++; f[0][0]=1; for(int i=0;i<n-(1<<t)+1;i++){ int mn=300,tot=0; for(int j=0;j<(1<<t);j++)vis[j]=0; for(int j=0;j<(1<<t);j++){ if(f[i][j])vis[j]=1; if(vis[j]){ for(int k=0;k<t;k++){ vis[j|(1<<k)]=1; } } } for(int j=0;j<(1<<t);j++){ if(vis[j]){ mn=min(mn,(int)s[i+1+j]); } } for(int j=0;j<(1<<t);j++){ if(vis[j]&&(int)s[i+1+j]==mn){ f[i+1][j]=1; } } res[i+1]=mn; } printf("%s",res+1); return 0; }