最大矩形,所有相同的数字

时间:2017-03-12 19:54:38

标签: dynamic-programming

  

给定数组n X m。你需要找到包含所有相同数字的最大矩形   例如:
  1 2 2 5
  1 2 2 4
  2 2 2 3
  答案应该是6.

如果问题是关于最大的方格,我可以解决这个问题。这是我的方法 -

for(int i=0; i<n; i++) for(int j=0; j<m; j++) {
    if(!i && !j) dp[i][j] = 1; 
    else if(a[i][j] == a[i-1][j-1] && 
       a[i][j] == a[i-1][j] &&
       a[i][j] == a[i][j-1])
           dp[i][j] = min({dp[i-1][j-1], dp[i][j-1], dp[i-1][j]}) + 1;
    else dp[i][j] = 1;
}

然后答案应该是dp表中的最大数字。如何修改它以获得最大的矩形?

1 个答案:

答案 0 :(得分:0)

你需要一个3d数组来存储rect的长度和宽度,即dp[INT_MAX][INT_MAX][2]。 通过替换 -

else if(a[i][j] == a[i-1][j-1] && 
   a[i][j] == a[i-1][j] &&
   a[i][j] == a[i][j-1])
       dp[i][j] = min({dp[i-1][j-1], dp[i][j-1], dp[i-1][j]}) + 1;

使用 -

else if(a[i][j] == a[i-1][j-1] && 
   a[i][j] == a[i-1][j] &&
   a[i][j] == a[i][j-1])
{     
        //for length along j
      dp[i][j][0]=min(dp[i][j][0]+1,dp[i-1][j-1][0]+1,dp[i][j][0]);

       //for length of rectangle along i
      dp[i][j][1]=min(dp[i][j][1],dp[i-1][j-1][1]+1,dp[i][j][1]);
}

休息很简单,矩形是单行的,可以使用简单的if-else来解决。