字符串、搜索、贪心、广度优先搜索

贪心,每次选择能够最小化字典序的操作。如果有多种操作方式能够最小化字典序就同时扩展,若一种操作方式扩展出的结果较劣就停止扩展。使用 bfs 逐轮扩展,时间复杂度 $O(n^2)$。

#include<bits/stdc++.h>
using namespace std;
struct Chose{int l,r;Chose(int _l,int _r):l(_l),r(_r){}};
bool on[2005][2005];
queue<Chose> q;
char s[2005];
int n,cnt;
char extend(int x){//扩展所有r-l+1=x的操作
    char ret='Z';
    vector<Chose> v;
    while(!q.empty()&&q.front().r-q.front().l+1==x) v.push_back(q.front()),q.pop();
    for(auto [l,r]:v) ret=min({ret,s[l],s[r]});
    for(auto [l,r]:v){
        if(s[l]==ret&&!on[l+1][r]) q.push(Chose(l+1,r)),on[l+1][r]=1;
        if(s[r]==ret&&!on[l][r-1]) q.push(Chose(l,r-1)),on[l][r-1]=1;
    }
    return ret;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) while(!isalpha(s[i])) s[i]=getchar();
    q.push(Chose(1,n));
    for(int i=1;i<=n;i++){
        putchar(extend(n-i+1));
        if((++cnt)%80==0) putchar('\n');
    }
    return 0;
}
最后修改:2024 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏