B-Buying Paint

题意:

给定一个矩阵,求以从四个拐角处开始画满螺旋矩阵的顺序构成的数组的子数组最大和

思路:

N=1000,暴力模拟,将八个数组全部打出
再通过经典的子数组最大和dp求出

int g[1005][1005];
int ans=0;
int f[maxn];
void dp(vector<int>&x){
    int last=0;
    for(int i=0;i<x.size();i++){
        f[i]=max(last+x[i],x[i]);
        last=f[i];
    }
    for(int i=0;i<x.size();i++){
        ans=max(ans,f[i]);
    }
}
void solve(){
    int n;cin>>n;
    rep(i,1,n){
        rep(j,1,n){
            cin>>g[i][j];
        }
    }
    vector<int>a[10];
    int t=1,b=n,l=1,r=n;
    int cnt=1;
    while(l<=r&&t<=b){
        for(int i=l;i<=r;i++){
            a[cnt].pb(g[t][i]);
        }t++;if(t>b)break;
        for(int i=t;i<=b;i++){
            a[cnt].pb(g[i][r]);
        }r--;if(l>r)break;
        for(int i=r;i>=l;i--){
            a[cnt].pb(g[b][i]);
        }b--;if(t>b)break;
        for(int i=b;i>=t;i--){
            a[cnt].pb(g[i][l]);
        }l++;if(l>r)break;
    }

    cnt++;
    l=t=1,r=b=n;

    while(l<=r&&t<=b){
        for(int i=t;i<=b;i++){
            a[cnt].pb(g[i][l]);
        }l++;if(l>r)break;
        for(int i=l;i<=r;i++){
            a[cnt].pb(g[b][i]);
        }b--;if(t>b)break;
        for(int i=b;i>=t;i--){
            a[cnt].pb(g[i][r]);
        }r--;if(l>r)break;
        for(int i=r;i>=l;i--){
            a[cnt].pb(g[t][i]);
        }t++;if(t>b)break;
    }

     cnt++;
    l=t=1,r=b=n;

    while(l<=r&&t<=b){
        for(int i=r;i>=l;i--){
            a[cnt].pb(g[t][i]);
        }t++;if(t>b)break;
        for(int i=t;i<=b;i++){
            a[cnt].pb(g[i][l]);
        }l++;if(l>r)break;
        for(int i=l;i<=r;i++){
            a[cnt].pb(g[b][i]);
        }b--;if(t>b)break;
        for(int i=b;i>=t;i--){
            a[cnt].pb(g[i][r]);
        }r--;if(l>r)break;
    }

    cnt++;
    l=t=1,r=b=n;

    while(l<=r&&t<=b){
        for(int i=t;i<=b;i++){
            a[cnt].pb(g[i][r]);
        }r--;if(l>r)break;
        for(int i=r;i>=l;i--){
            a[cnt].pb(g[b][i]);
        }b--;if(t>b)break;
        for(int i=b;i>=t;i--){
            a[cnt].pb(g[i][l]);
        }l++;if(l>r)break;
        for(int i=l;i<=r;i++){
            a[cnt].pb(g[t][i]);
        }t++;if(t>b)break;
    }
    cnt++;
    l=t=1,r=b=n;

    while(l<=r&&t<=b){
        for(int i=b;i>=t;i--){
            a[cnt].pb(g[i][l]);
        }l++;if(l>r)break;
        for(int i=l;i<=r;i++){
            a[cnt].pb(g[t][i]);
        }t++;if(t>b)break;
        for(int i=t;i<=b;i++){
            a[cnt].pb(g[i][r]);
        }r--;if(l>r)break;
        for(int i=r;i>=l;i--){
            a[cnt].pb(g[b][i]);
        }b--;if(t>b)break;
    }
     cnt++;
    l=t=1,r=b=n;
    while(l<=r&&t<=b){
        for(int i=l;i<=r;i++){
            a[cnt].pb(g[b][i]);
        }b--;if(t>b)break;
        for(int i=b;i>=t;i--){
            a[cnt].pb(g[i][r]);
        }r--;if(l>r)break;
        for(int i=r;i>=l;i--){
            a[cnt].pb(g[t][i]);
        }t++;if(t>b)break;
        for(int i=t;i<=b;i++){
            a[cnt].pb(g[i][l]);
        }l++;if(l>r)break;
    }
     cnt++;
    l=t=1,r=b=n;
    while(l<=r&&t<=b){
        for(int i=b;i>=t;i--){
            a[cnt].pb(g[i][r]);
        }r--;if(l>r)break;
        for(int i=r;i>=l;i--){
            a[cnt].pb(g[t][i]);
        }t++;if(t>b)break;
        for(int i=t;i<=b;i++){
            a[cnt].pb(g[i][l]);
        }l++;if(l>r)break;
        for(int i=l;i<=r;i++){
            a[cnt].pb(g[b][i]);
        }b--;if(t>b)break;
    }
     cnt++;
    l=t=1,r=b=n;
    while(l<=r&&t<=b){
        for(int i=r;i>=l;i--){
            a[cnt].pb(g[b][i]);
        }b--;if(t>b)break;
        for(int i=b;i>=t;i--){
            a[cnt].pb(g[i][l]);
        }l++;if(l>r)break;
        for(int i=l;i<=r;i++){
            a[cnt].pb(g[t][i]);
        }t++;if(t>b)break;
        for(int i=t;i<=b;i++){
            a[cnt].pb(g[i][r]);
        }r--;if(l>r)break;
    }
    rep(i,1,cnt){
        // for(int j=0;j<n*n;j++){
        //     cout<<a[i][j]<<' ';
        // }
        // cout<<endl;
        dp(a[i]);
    }
    cout<<ans<<endl;
}
posted @ 2025-05-29 08:46  Marinaco  阅读(20)  评论(0)    收藏  举报
//雪花飘落效果