牛牛和15朋友來玩打土豪分田地的游戲,牛牛決定讓你來分田地,地主的田地可以看成是一個矩形,每個位置有一個價值。分割田地的方法是橫豎各切三刀,分成26份,作為領導干部,牛牛總是會選擇其中總價值最小的一份田地,作為牛牛最好的朋友,你希望牛牛取得的田地價值和盡可能大,你知道這個值最大可以是多少嗎?
輸入兩個整數n和m(1≤n,m≤75)表示田地的大小,接下來n行,每行包括m個0-9之間的數字,表示每塊位置的價值:
4 4 3332 3233 3332 2323
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include<memory.h> #define _CRT_SECURE_NO_DEPRECATE using namespace std; const int N = 10010; char str[100]; int a[110][110]; int sum[110][110], n, m; int calc(int x, int y, int i, int j){ return sum[x][y] - sum[x][j] - sum[i][y] + sum[i][j]; } bool judge(int x){ for (int i = 1; i <= m - 3; i++) { for (int j = i + 1; j <= m - 2; j++) { for (int k = j + 1; k <= m - 1; k++) { int last = 0, cnt = 0; for (int r = 1; r <= n; r++){ int s1 = calc(r, i, last, 0); int s2 = calc(r, j, last, i); int s3 = calc(r, k, last, j); int s4 = calc(r, m, last, k); if (s1 >= x && s2 >= x && s3 >= x && s4 >= x){ last = r; cnt++; } printf("i = %d j = %d k = %d last = %d\n",i, j, k, last); } if (cnt >= 4)return true; } } } return false; } int main(){ while (scanf("%d%d", &n, &m) > 0){ for (int i = 1; i <= n; i++){ scanf("%s", str + 1); for (int j = 1; j <= m; j++){ a[i][j] = str[j] - '0';//這樣輸入連續的數字到數組,先輸入到字符串 } } for (int i = 0; i <= n; i++){ for (int j = 0; j <= m; j++){ cout << a[i][j] << " "; } cout << endl; } cout << endl; memset(sum, 0, sizeof sum); for (int i = 1; i <= n; i++){ for (int j = 1; j <= m; j++){ sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j]; } } for (int i = 0; i <= n; i++){ for (int j = 0; j <= m; j++){ cout << sum[i][j] << " "; } cout << endl; } int l = 0, r = sum[n][m], ans = 0; while (l <= r){ int m = (l + r) >> 1; if (judge(m)){ l = m + 1; ans = m; } else r = m - 1; } printf("%d\n", ans); } }

