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;
}

浙公网安备 33010602011771号