求条
查看原帖
求条
676498
封禁用户楼主2024/1/2 23:02

赛时代码,写的类似区间 dp,但是没调出来(赛后看题解发现思路是对的)

#include<bits/stdc++.h>
using namespace std;
int n,f[109][109],g[109][109],m[109][109],q[109][109],a[109],r,w,o,z;//f[r][d]:[k,k+r-1]在[d,d+r]时最大的b,g[r][d]:最大值位置,m[r][d]:消除最大值后左端点的位置,q[r][d]:消除最大值后的区间长度
bool h[109][109];//h[r][d]:[次大值在最大值右边]
int main(){
    cin>>n;
    for(int i=1;i<=n;++i) f[1][i]=0,g[1][i]=i;
    for(int i=2;i<=n;++i){
        for(int u=1,v=i;v<=n;++u,++v) for(int s=u;s<v;++s){r=s-1,s+1+r>=n?(w=r-2+(s+1+r-1<n),o=z=0):(w=f[z=min(v+r,n-1)-(s+r)][o=s+r]+r);if(w>f[i][u]) f[i][u]=w,g[i][u]=s,m[i][u]=o,q[i][u]=z,h[i][u]=1;}//次大值在s右边
        for(int u=1,v=i;v<=n;++u,++v) if(n+1!=v*2&&h[i][n+1-v]){w=f[i][n+1-v];if(f[i][u]<w) f[i][u]=w,h[i][u]=0,g[i][u]=n+1-g[i][n+1-v],m[i][u]=n+1-(m[i][n+1-v]+q[i][n+1-v]-1),q[i][u]=q[i][n+1-v];}//次大值在s左边
    }
    a[1]=1,a[n]=2;
    int u=2,v=n-1,d=2,l=3,r=n;
    while(1){
        if(u>v) break;
        if(u==v){a[d]=l;break;}
        int t=g[v-u+1][u];
        bool s=h[v-u+1][u];
        o=m[v-u+1][u],z=q[v-u+1][u];
        if(s){
            for(int i=u;i<t;++i) a[i+d-u]=l++;
            for(int i=t+1+z;i<=v;++i) a[i+d-u]=l++;
            a[t+d-u]=r--;
            d=o,u=o+t-1,v=u+z-1;
        }
        else{
            for(int i=t+1;i<=v;++i) a[i+d-u]=l++;
            for(int i=u;i<=t-1-z;++i) a[i+d-u]=l++;
            a[t+d-u]=r--;
            d=o,u=o+n-t,v=u+z-1;
        }
    }
    for(int i=1;i<=n;++i) cout<<a[i]<<" ";
}
2024/1/2 23:02
加载中...