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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[DP]【最大全零矩阵】【2015.7.9TEST】E

發布時間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [DP]【最大全零矩阵】【2015.7.9TEST】E 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

E
0.9 seconds, 32 MB
“ 于是乎,你至少證明了你智商比金天成高。也就說你證明了你不是低智兒童,不錯不錯。
然而這次, 我貌似也卡住了,你給我打下手吧。

勇敢的少年啊快去創造奇跡!”
——-By Doctor Z
貌似 Z 博士正在解析 Zvangelion 初號機的一些問題。 中間遇到了困難。
Zvangelion 初號機有一塊 R*S 的電路模塊被某種 UMA 感染了。 為了方便我們用整數
描寫敘述每一個單元的零件, 即用一個整數矩陣來表示該模塊。
這樣的 UMA 的習性是,假設一塊 N*M 的模塊 S 被感染了(N,M>1)。 那么它必定會讓第
(1,1)(N,1)(1,M)和(N,M)上的元件保持( 意味著假設該電路被各種修改,都會滿足) 以
下關系:( UMA 僅僅會感染至少 2 行且至少 2 列的電路模塊)
a[1][1] + a[N][M] ≤a[1][M] + a[N][1]
(注:a[i][j]表示矩陣中第 i 行第 j 列的數值)
然而, 誰說的一塊電路不會被反復感染? 當一塊電路被反復感染到,隨意一個子電路模
塊(即矩陣的一個子矩陣所表示的電路)都被感染了。那么這塊電路就會發生可怕的事情,
對的, 就是異變!( 正確講法應該是使徒化)
Z 博士須要知道, 這個 R*S 的電路模塊中, 面積最大的有異變( 使徒化) 嫌疑的子電
路模塊的面積是多少?
【 輸入】
第一行兩個正整數 R 和 S(2≤R,S≤1000)。表示 Zvangelion 的電路模塊大小。
下接一個 R 行 S 列的矩陣, 用整數來描寫敘述電路模塊內 R*S 個電路單元上的元件。

描寫敘述所用
的整數分布在[-1000000,1000000]內。


【 輸出】 面積最大的有異變(使徒化)嫌疑的子電路模塊的面積。

假設沒有則請輸出 0.
【 測試例子】
Input
3 3
1 4 10
5 2 6
11 1 3
Output
9
Input
3 3
1 3 1
2 1 2
1 1 1
Output
4
Input
5 6
1 1 4 0 3 3
4 4 9 7 11 13
-3 -1 4 2 8 11
1 5 9 5 9 10
4 8 10 5 8 8
Output
15
著重解釋第二個測試例子。假設整個電路模塊都有變異嫌疑,那么要求的是 3*3 的矩
陣 1 個。 2*2 的矩陣共 4 個都滿足被感染的條件。

然而觀察發現左下角和右上角的 2*2 矩
陣并不滿足要求。所以最大的面積既不可能是 9( 3*3),也不可能是 6( 2*3 或 3*2), 然
后左上角的 2*2 矩陣有變異嫌疑。故最大面積為 4( 2*2)。

第三個測試例子的變異模塊為
從(3,2)開始一直到( 5,6)結束的子模塊。
測試數據范圍: 有 60%的數據滿足 R、 S≤350

對于感染的條件,我們能夠發現一個性質:
a b c
d e f
假設1.a+e<=b+d => a-b<=d-e
2.b+f<=c+e => b-c<=e-f
能夠推出a-c<=d-f =>a+f<=c+d
這樣一來這道題就能簡化成一個求最大全零矩陣的問題。
對于1到r-1,1到s-1的點假設以它為左上方點的2*2矩陣為符合要求。就把這個點標記為0。否則就為1。然后就生成了長r-1,寬s-1的矩陣,答案就是最大的全0矩陣。

#include<cstdio> #include<cstring> #define maxl 1001int r,s,ans=0; int a[maxl][maxl]; int f[maxl][maxl],h[maxl],l[maxl],rr[maxl];void prework() {freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);scanf("%d%d",&r,&s);for(int i=1;i<=r;i++)for(int j=1;j<=s;j++)scanf("%d",&a[i][j]); }void mainwork() {for(int i=1;i<=r-1;i++)for(int j=1;j<=s-1;j++)if(a[i][j]+a[i+1][j+1]<=a[i+1][j]+a[i][j+1])f[i][j]=0;elsef[i][j]=1;for(int i=1;i<=r-1;i++){for(int j=1;j<=s-1;j++) //h[j]表示第i行第j列向上有多少個連續的0 ,以下枚舉的矩陣就是以h[j]為高度 {if(f[i][j]==0)h[j]++;elseh[j]=0; //這一個是1就不能往下延續長度了 }for(int j=1;j<=s-1;j++){l[j]=j; //先假設這個高度為h[j]矩陣的左的邊就是j while(l[j]>1 && h[j]<=h[l[j]-1])//假設h[j]是小于h[l[j]-1],l[j]直接拓展到 l[l[j]-1]l[j]=l[l[j]-1]; //由于l[l[j]-1]是已經拓展過的對l[j]-1來說最左邊的邊,肯定是已經符合了要求的 }for(int j=s-1;j>=1;j--) //和拓展左區間一樣的做法 {rr[j]=j;while(rr[j]<s-1 && h[j]<=h[rr[j]+1])rr[j]=rr[rr[j]+1];}for(int j=1;j<=s-1;j++) //找最大的矩陣。由于這里是縮點縮成的01矩陣,計算面積時長和寬要+1 {if(ans<(h[j]+1)*(rr[j]-l[j]+2))ans=(h[j]+1)*(rr[j]-l[j]+2);}} }void print() {printf("%d",ans); }int main() {prework();mainwork();print();return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的[DP]【最大全零矩阵】【2015.7.9TEST】E的全部內容,希望文章能夠幫你解決所遇到的問題。

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