1 条题解
-
0
C++ :
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #define gmax(a,b) ((a)>(b)?(a):(b)) #define fill(a,b) memset(a,b,sizeof(a)) #define MAXN 2000 #define MAXM 2000 using namespace std; int n, m, k; int a[MAXN][MAXM]; int s[MAXN][MAXM]; int ak[MAXN][MAXM]; int lu[MAXN][MAXM], ru[MAXN][MAXM], ld[MAXN][MAXM], rd[MAXN][MAXM]; int ans; int main(){ int i, j; scanf("%d %d %d", &n, &m, &k); for (i=1; i<n+1; i++){ for (j=1; j<m+1; j++){ scanf("%d", &a[i][j]); } } fill(s, 0); for (i=1; i<n+1; i++){ for (j=1; j<m+1; j++){ s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j]; } } fill(ak, 0); for (i=k; i<n+1; i++){ for (j=k; j<m+1; j++){ ak[i][j] = s[i][j] - s[i - k][j] - s[i][j - k] + s[i - k][j - k]; } } fill(lu, 0); for (i=k; i<n+1; i++){ for (j=k; j<m+1; j++){ lu[i][j] = ak[i][j]; lu[i][j] = gmax(lu[i][j], lu[i - 1][j]); lu[i][j] = gmax(lu[i][j], lu[i][j - 1]); } } fill(ru, 0); for (i=k; i<n+1; i++){ for (j=m-k+1; j; j--){ ru[i][j] = ak[i][j + k - 1]; ru[i][j] = gmax(ru[i][j], ru[i - 1][j]); ru[i][j] = gmax(ru[i][j], ru[i][j + 1]); } } fill(ld, 0); for (i=n-k+1; i; i--){ for (j=k; j<m+1; j++){ ld[i][j] = ak[i + k - 1][j]; ld[i][j] = gmax(ld[i][j], ld[i + 1][j]); ld[i][j] = gmax(ld[i][j], ld[i][j - 1]); } } fill(rd, 0); for (i=n-k+1; i; i--){ for (j=m-k+1; j; j--){ rd[i][j] = ak[i + k - 1][j + k - 1]; rd[i][j] = gmax(rd[i][j], rd[i + 1][j]); rd[i][j] = gmax(rd[i][j], rd[i][j + 1]); } } ans = 0; for (j=k; j+(k<<1)<m+1; j++){ for (i=k; i<n+1; i++){ int t = lu[n][j] + ak[i][j + k] + ru[n][j + k + 1]; ans = gmax(ans, t); } } for (i=k; i+(k<<1)<n+1; i++){ for (j=k; j<m+1; j++){ int t = lu[i][m] + ak[i + k][j] + ld[i + k + 1][m]; ans = gmax(ans, t); } } for (j=k; j+k<m+1; j++){ for (i=k; i+k<n+1; i++){ int t = lu[n][j] + ru[i][j + 1] + rd[i + 1][j + 1]; ans = gmax(ans, t); } } for (j=k; j+k<m+1; j++){ for (i=k; i+k<n+1; i++){ int t = lu[i][j] + ld[i + 1][j] + rd[1][j + 1]; ans = gmax(ans, t); } } for (i=k; i+k<n+1; i++){ for (j=k; j+k<m+1; j++){ int t = lu[i][n] + ld[i + 1][j] + rd[i + 1][j + 1]; ans = gmax(ans, t); } } for (i=k; i+k<n+1; i++){ for (j=k; j+k<m+1; j++){ int t = lu[i][j] + ru[i][j + 1] + ld[i + 1][m]; ans = gmax(ans, t); } } printf("%d\n", ans); return 0; }
Java :
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { static int map[][]; static int sum[][]; static int kk[][]; static int leftup[][]; static int rightup[][]; static int leftdown[][]; static int rightdown[][]; static int max(int a, int b) { return a>b?a: b; } static void print(int arr[][]) { for(int i=0;i<arr.length;i++) { for(int j=0;j<arr[i].length;j++) { System.out.print(arr[i][j]+" "); } System.out.println(); } System.out.println(); } public static void main(String args[]) throws IOException { int M,N,K; //Scanner in = new Scanner(System.in); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //录入数据 String cs[] = br.readLine().split(" "); M=Integer.valueOf(cs[0]); N=Integer.valueOf(cs[1]); K=Integer.valueOf(cs[2]); //M=in. nextInt(); //N=in. nextInt(); //K=in. nextInt(); int m = M-K+1; int n = N-K+1; map = new int[M+1][N+1]; for(int i=1;i<=M;i++) { cs = br.readLine().split(" "); for(int j=1;j<=N;j++) { //map[i][j]=in.nextInt(); map[i][j]=Integer. valueOf(cs[j-1]); } } //用前缀和计算 sum sum = new int[M+1][N+1]; for(int i=1;i<=M;i++) { for(int j=1;j<=N;j++) { sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+map[i] [j]; } } //用前缀和计算 kk kk = new int[m][n]; for(int i=K;i<=M;i++) { for(int j=K;j<=N;j++) { kk[i-K][j-K]=sum[i][j]-sum[i-K][j]-sum[i][j-K]+sum[i-K] [j-K]; } } //计算四个方向的 max leftup = new int[m][n]; rightup = new int[m][n]; leftdown = new int[m][n]; rightdown = new int[m][n]; leftup[0][0]=kk[0][0]; for(int i=1;i<m;i++) leftup[i][0]=max(kk[i][0], leftup[i-1][0]); for(int j=1;j<n;j++) leftup[0][j]=max(kk[0][j], leftup[0][j-1]); for(int i=1;i<m;i++) { for(int j=1;j<n;j++) { leftup[i][j]=max(kk[i][j], max(leftup[i-1][j], leftup[i] [j-1])); } } rightup[0][n-1]=kk[0][n-1]; for(int i=1;i<m;i++) rightup[i][n-1]=max(kk[i][n-1], rightup[i-1][n-1]); for(int j=n-2;j>=0;j--) rightup[0][j]=max(kk[0][j], rightup[0][j+1]); for(int i=1;i<m;i++) { for(int j=n-2;j>=0;j--) { rightup[i][j]=max(kk[i][j], max(rightup[i-1][j], rightup[i][j+1])); } } leftdown[m-1][0]=kk[m-1][0]; for(int i=m-2;i>=0;i--) leftdown[i][0]=max(kk[i][0], leftdown[i+1][0]); for(int j=1;j<n;j++) leftdown[m-1][j]=max(kk[m-1][j], leftdown[m-1][j-1]); for(int i=m-2;i>=0;i--) { for(int j=1;j<n;j++) { leftdown[i][j]=max(kk[i][j], max(leftdown[i][j-1], leftdown[i+1][j])); } } rightdown[m-1][n-1]=kk[m-1][n-1]; for(int i=m-2;i>=0;i--) rightdown[i][n-1]=max(kk[i][n-1], rightdown[i+1][n-1]); for(int j=n-2;j>=0;j--) rightdown[m-1][j]=max(kk[m-1][j], rightdown[m-1][j+1]); for(int i=m-2;i>=0;i--) { for(int j=n-2;j>=0;j--) { rightdown[i][j]=max(kk[i][j], max(rightdown[i+1][j], rightdown[i][j+1])); } } //计算六种情况 int ans=0; //一 for(int j=0;j<n-2*K;j++) { for(int i=0;i<m;i++) { ans = max(ans, leftup[m-1][j]+kk[i][j+K]+rightup[m-1][j +K+K]); } } //| for(int i=0;i<m-2*K;i++) { for(int j=0;j<n;j++) { ans = max(ans, leftup[i][n-1]+kk[i+K][j]+leftdown[i+K+K] [n-1]); } } //左 for(int i=0;i<m-K;i++) { for(int j=0;j<n-K;j++) { ans = max(ans, leftup[m-1][j]+rightup[i][j+K]+rightdown [i+K][j+K]); } } //右 for(int i=0;i<m-K;i++) { for(int j=n-1;j-K>0;j--) { ans = max(ans, leftup[i][j-K]+leftdown[i+K][j-K]+rightup[m-1][j]); } } //上 for(int i=0;i<m-K;i++) { for(int j=0;j<n-K;j++) { ans = max(ans, leftup[i][n-1]+leftdown[i+K][j]+rightdown[i+K][j+K]); } } //下 for(int i=K;i<m;i++) { for(int j=0;j<n-K;j++) { ans = max(ans, leftup[i-K][j]+rightup[i-K][j+K]+leftdown[i][n-1]); } } System. out.println(ans); } }
- 1
信息
- ID
- 1040
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者