ABC347F求条
  • 板块学术版
  • 楼主assert_0
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/31 18:51
  • 上次更新2024/3/31 18:56:22
查看原帖
ABC347F求条
532536
assert_0楼主2024/3/31 18:51
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 1100
int n,m,a[N][N],sum[N][N],dp[N][N][5],r[N][N],c[N][N],row[N],col[N],ans;
int solve(int a,int b,int c,int d){
	if(c>=n+1||d>=n+1){
		return 0;
	} 
	return sum[c][d]-sum[a-1][d]-sum[c][b-1]+sum[a-1][b-1];
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			dp[i][j][1]=max(dp[i][j-1][1],max(dp[i-1][j][1],solve(i-m+1,j-m+1,i,j)));
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=n;j>=1;j--){
			dp[i][j][2]=max(dp[i][j+1][2],max(dp[i-1][j][2],solve(i-m+1,j,i,j+m-1)));
		}
	}
	for(int i=n;i>=1;i--){
		for(int j=1;j<=n;j++){
			dp[i][j][3]=max(dp[i][j-1][3],max(dp[i+1][j][3],solve(i,j-m+1,i+m-1,j)));
		}
	}
	for(int i=n;i>=1;i--){
		for(int j=n;j>=1;j--){
			dp[i][j][4]=max(dp[i][j+1][4],max(dp[i+1][j][4],solve(i,j,i+m-1,j+m-1)));
		}
	}
	for(int i=1;i<=n-m+1;i++){
		for(int j=1;j<=n-m+1;j++){
			row[i]=max(row[i],solve(i,j,i+m-1,j+m-1));
			col[j]=max(col[j],solve(i,j,i+m-1,j+m-1));
		}
	}
	for(int i=1;i<=n-m+1;i++){
		r[i][i+m-1]=row[i];
		c[i][i+m-1]=col[i];
	}
	for(int i=m;i<=n-1;i++){
		for(int j=1;j<=n-i;j++){
			r[j][j+i]=max(r[j][j+i-1],r[j+1][j+i]);
			c[j][j+i]=max(c[j][j+i-1],c[j+1][j+i]);
		}
	}
	for(int i=1;i<=n-m+1;i++){
		for(int j=1;j<=n-m+1;j++){
			ans=max(ans,max(dp[i][j][1]+dp[i][j+1][2]+r[i+1][n],max(dp[i][j][1]+dp[i+1][j][3]+c[j+1][n],max(dp[i][j+1][2]+dp[i+1][j+1][4]+c[1][j],dp[i+1][j][3]+dp[i+1][j+1][4]+r[1][i]))));
		}
	}
	for(int i=m;i<=n;i++){
		for(int j=i+m;j<=n-m;j++){
			ans=max(ans,r[1][i]+r[i+1][j]+r[j+1][n]);
		}
	}
	for(int i=m;i<=n;i++){
		for(int j=i+m;j<=n-m;j++){
			ans=max(ans,c[1][i]+c[i+1][j]+c[j+1][n]);
		}
	}
	cout<<ans<<endl;
	return 0;
}

wa*6

2024/3/31 18:51
加载中...