cv1159 最大全0子矩阵(极大子矩阵)
題目描述 Description
在一個01方陣中找出其中最大的全0子矩陣,所謂最大是指0的個數最多。
輸入描述 Input Description
輸入文件第一行為整數N,其中1<=N<=2000,為方陣的大小,緊接著N行每行均有N個0或1,相鄰兩數間嚴格用一個空格隔開。
輸出描述 Output Description
輸出文件僅一行包含一個整數表示要求的最大的全零子矩陣中零的個數。
樣例輸入 Sample Input
5
0 1 0 1 0
0 0 0 0 0
0 0 0 0 1
1 0 0 0 0
0 1 0 0 0
樣例輸出 Sample Output
9
分析:
dp
雖然是轉載了淺談用極大化思想解決最大子矩陣問題
然而也不是很明白
代碼量極小!!!
那么我們就一點一點的解釋一下:
認真的研讀了論文之后,
我發現兩種算法各有長處
而這道題n*m是2000*2000,所以我們可以選擇算法二
再簡單理一下算法二的思路,枚舉每一列
計算這個坐標上的懸線長度,
之后從前往后,從后往前兩次掃描,得到從該懸線能夠擴展到的最遠左右端點,
這樣答案統計的時候就記錄一下(r-l+1)*h
回歸代碼,首先是變量的意義:
r,h,l都為滾動數組,l表示向左最遠可以擴展的距離,r表示向右最遠可以擴展的距離,h表示向上最遠可以擴展的距離
la表示當前懸線向左擴展遇到的第一個障礙點的位置,ra表示當前懸線向左擴展的第一個障礙點的位置
在完成讀入之后,我們就開始了數組的初始化
顯然一開始我們認為所有點都能夠擴展到左右邊界,懸線長度為0
之后枚舉行數
h[j]表示第j列在當前狀況下的懸線長度
l[j]表示第j列上的這條懸線盡力向左擴展的坐標
r[j]表示第j列上的這條懸線盡力向右擴展的坐標
維護l
- 如果這個點是障礙點,那么h(能夠向上擴展的距離)顯然是0
因為j是從小到大枚舉的,所以在轉移j+1的時候
la至少是當前點,所以在遇到障礙點的時候,la=j
l[j]=1是為了方便之后的計算
(再說了,h已經等于0了,l等于什么就不重要了,我們為何不為以后的狀態著想一下呢) - 如果不是障礙點,懸線的長度就可以增加了,
同時維護正確的l
維護r
如果這個點是障礙點,在維護l的時候我們已經把h變成0了,
ra=j
r[j]=m 這也是為了以后的轉移著想如果這個點不是障礙點,維護r
答案統計
轉載于:https://www.cnblogs.com/wutongtong3117/p/7673169.html
總結
以上是生活随笔為你收集整理的cv1159 最大全0子矩阵(极大子矩阵)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mixin使用场景
- 下一篇: mybatis中的多对一的查询