给定数组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表中的最大数字。如何修改它以获得最大的矩形?
答案 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来解决。