5
class SubMatrix {
private:
bool checkRec(vector>& mat, int x, int y, int len)
{
int digit = mat[x][y];
for (int i = 0; i < len; ++i) if (mat[x + i][y] != digit || mat[x + i][y + len - 1] != digit) return false;
for (int j = 0; j < len; ++j) if (mat[x][y + j] != digit || mat[x + len - 1][y + j] != digit) return false;
return true;
}
public:
int maxSubMatrix(vector> mat, int n)
{
int maxLen = 1;
for (int i = 0; i < n - maxLen; ++i)
{
for (int j = 0; j < n - maxLen; ++j)
{
for (int k = maxLen + 1; max(i, j) + k - 1 < n; ++k)
{
if (checkRec(mat, i, j, k)) maxLen = max(maxLen, k);
}
}
}
return maxLen;
}
};
发表于 2017-07-02 18:47:41
回复(3)
9
import java.util.*;
public class SubMatrix {
/**
* 使用动态规划
* left[i][j]: 坐标[i,j]的左边有连续相同的数个数,包含自己
* above[i][j]: 坐标[i,j]的上边有连续相同的数个数,包含自己
* 初始值:left[i][j]=1; above[i][j]=1
* 递推式:
* left[i][j]=left[i][j-1]+1, mat[i][j]==mat[i][j-1];
* left[i][j]=1, mat[i][j]!=mat[i][j-1];
* above[i][j]=above[i-1][j]+1, mat[i][j]==mat[i-1][j];
* above[i][j]=1, mat[i][j]!=mat[i-1][j];
* 在递推的过程中求解: mat[i][j]==mat[i][j-1]&&mat[i][j]==mat[i-1][j]
* @param mat
* @param n
* @return
*/
public int maxSubMatrix(int[][] mat, int n) {
int max = 1;
int[][] left = new int[n][n];
int[][] above = new int[n][n];
initial(mat, n, left, above);
for (int i = 1; i < n; i++) {
for (int j = 1; j < n; j++) {
if (mat[i - 1][j] != mat[i][j] || mat[i][j - 1] != mat[i][j]) {
if (mat[i - 1][j] != mat[i][j]
&& mat[i][j - 1] != mat[i][j]) {
left[i][j] = 1;
above[i][j] = 1;
} else if (mat[i][j - 1] != mat[i][j]) {
left[i][j] = 1;
above[i][j] = above[i-1][j] + 1;
} else {
above[i][j] = 1;
left[i][j] = left[i][j-1] + 1;
}
} else {
left[i][j] = left[i][j - 1] + 1;
above[i][j] = above[i - 1][j] + 1;
int min = Math.min(left[i][j - 1], above[i - 1][j]);
for (int k = min; k > 0 && min>=max; k--) {//此处求解结果
if (above[i][j - min] >= (min + 1)
&& left[i - min][j] >= (min + 1)) {
max = Math.max(max, min + 1);
break;
}
}
}
}
}
return max;
}
public void initial(int[][] mat, int n, int[][] left, int[][] above) {
left[0][0] = 1;
Arrays.fill(above[0], 1);
for (int i = 1; i < n; i++) {
left[i][0] = 1;
if (mat[0][i] != mat[0][i - 1]) {
left[0][i] = 1;
} else {
left[0][i] = left[0][i - 1] + 1;
}
}
for (int i = 1; i < n; i++) {
if (mat[i][0] != mat[i - 1][0]) {
above[i][0] = 1;
} else {
above[i][0] = above[i - 1][0] + 1;
}
}
}
}
发表于 2016-08-05 23:02:46
回复(6)
5
class SubMatrix {
public:
int maxSubMatrix(vector > mat, int n) {
//选定最大子方阵的边长,选择顶点,判断是合法
int maxLength = n;
while(maxLength){
for(int i = 0; i <= n - maxLength; ++i){
for(int j = 0; j <= n - maxLength; ++j){
int pixel = mat[i][j];
bool flag = true;
for(int k = 0; k < maxLength; ++k){
int top = mat[i][j + k]; // 上边的线
int bottom = mat[i + maxLength - 1][j + k]; // 下边的线
int left = mat[i + k][j]; // 左边的线
int right = mat[i + k][j + maxLength -1]; // 右边的线
if(top != pixel || bottom != pixel || left != pixel || right != pixel){
flag = false;
break;
}
}
if(flag)
return maxLength;
}
}
maxLength--;
}
return 0;
}
};
发表于 2017-05-05 21:44:55
回复(3)
2
import java.util.*;
public class SubMatrix {
public int maxSubMatrix(int[][] mat, int n) {
int max = 1;
int[][] left = new int[n][n];
int[][] above = new int[n][n];
initial(mat, n, left, above);
for (int i = 1; i
for (int j = 1; j
if (mat[i][j]==mat[i-1][j] && mat[i][j]==mat[i][j-1]) {
left[i][j] = left[i][j-1]+1;
above[i][j] = above[i-1][j]+1;
int len = Math.min(left[i][j],above[i][j]);
for(int k=len-1;k>0&&k+1>max;k--){
if(above[i][j-k]>k && left[i-k][j]>k){
max = k+1;
break;
}
}
} else if(mat[i][j]!=mat[i-1][j] && mat[i][j]!=mat[i][j-1]){
left[i][j] = 1;
above[i][j] = 1;
} else if(mat[i][j]==mat[i][j-1]){
left[i][j] = left[i][j-1]+1;
above[i][j] = 1;
} else if(mat[i][j]==mat[i-1][j]){
left[i][j] = 1;
above[i][j] = above[i-1][j]+1;
}
}
}
return max;
}
public void initial(int[][] mat, int n, int[][] left, int[][] above) {
for(int i=0;i
left[i][0] = 1;
above[0][i] = 1;
}
for(int j=1;j
if(mat[0][j]==mat[0][j-1])
left[0][j] = left[0][j-1]+1;
else
left[0][j] = 1;</