java最大子方阵_最大子方阵

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值