日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cv1159 最大全0子矩阵(极大子矩阵)

發布時間:2023/11/29 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

答案統計

這里寫代碼片 #include<cstdio> #include<cstring> #include<iostream>using namespace std;int n,m,r[2003],l[2003],h[2003],ans=0,la,ra; int mp[2010][2010];int main() {scanf("%d",&n);m=n;int i,j;for (i=1;i<=n;i++)for (j=1;j<=n;j++)scanf("%d",&mp[i][j]);for (i=1;i<=m;i++)h[i]=0,l[i]=1,r[i]=m;for (i=1;i<=n;i++){la=0;ra=m+1;for (j=1;j<=m;j++)if (mp[i][j])h[j]=0,la=j,l[j]=1;elseh[j]++,l[j]=max(l[j],la+1);for (j=m;j>0;j--)if (mp[i][j])r[j]=m,ra=j;elser[j]=min(ra-1,r[j]),ans=max(ans,(r[j]-l[j]+1)*h[j]);}printf("%d",ans);return 0; }

轉載于:https://www.cnblogs.com/wutongtong3117/p/7673169.html

總結

以上是生活随笔為你收集整理的cv1159 最大全0子矩阵(极大子矩阵)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。