Vijos1055(極大子矩陣)

2022-08-23 04:09:10 字數 1986 閱讀 5760

題目鏈結

分析:

**用極大化思想解決最大子矩陣問題

演算法二的複雜度是n*m,顯然這道題是不能承受的

那麼我們只能看一下演算法一了:

演算法一的**量明顯多於演算法二

主要分成兩大部分:

首先按照x座標排序

第一面掃瞄我們從左到右,

miny表示最大向下擴充套件到的下邊界,maxy表示最大向上擴充套件到的上邊界,

dx表示矩陣的長,dy表示矩陣的寬,s表示矩陣的面積

針對每乙個點,我們先向右擴充套件,

初始狀態是:

miny=0;   //預設能擴充套件到邊界

maxy=m;

s=0;

需要注意的是再向右推的時候,我們要同時維護miny和maxy

就像**中說的那樣:

if (po[j].y

<=po[i].y&&po[j].y>miny) miny=po[j].y

;if (po[j].y>=po[i].y&&po[j].y

.y;

如圖:

單純這樣轉移完之後,我們發現有一塊面積我們沒有計算過:

所以在第一層迴圈中,我們需要再單獨計算一下這塊面積

之後我們再從後往前,向左擴充套件,重複上述操作

進行完上述操作後,我們發現

還有一部分面積我們沒有考慮到

我們把點按照y排序

那麼每塊的面積就是

dx=n;

dy=po[i].y-po[i-1].y;

s=dx*dy;

當然,第乙個點和最後乙個點需要特殊處理一下

這裡寫**片

#include

#include

#include

#include

using namespace std;

int n,m,num,maxy,miny,ans=0,dx,dy,s;

struct node;

node po[10000];

int cmp1(const node &a,const node &b)

int cmp2(const node &a,const node &b)

void doit()

dx=n-po[i].x;

dy=maxy-miny;

s=dx*dy;

ans=max(ans,s);

}for (i=num;i>=1;i--)

dx=po[i].x;

dy=maxy-miny;

s=dx*dy;

ans=max(ans,s);

}sort(po+1,po+1+num,cmp2);

for (i=1;i<=num;i++)

}printf("%d",ans);

}int main()

for (int i=1;i<=num;i++)

scanf("%d

%d",&po[i].x,&po[i].y);

doit();

return

0;}

Vijos 1055 奶牛浴場 極大化思想

題目鏈結 描述 由於john建造了牛場圍欄,激起了奶牛的憤怒,奶牛的產奶量急劇減少。為了討好奶牛,john決定在牛場中建造乙個大型浴場。但是john的奶牛有乙個奇怪的習慣,每頭奶牛都必須在牛場中的乙個固定的位置產奶,而奶牛顯然不能在浴場中產奶,於是,john希望所建造的浴場不覆蓋這些產奶點。這回,他...

18 03 20 vijos1055奶牛浴場

由於john建造了牛場圍欄,激起了奶牛的憤怒,奶牛的產奶量急劇減少。為了討好奶牛,john決定在牛場中建造乙個大型浴場。但是john的奶牛有乙個奇怪的習慣,每頭奶牛都必須在牛場中的乙個固定的位置產奶,而奶牛顯然不能在浴場中產奶,於是,john希望所建造的浴場不覆蓋這些產奶點。這回,他又要求助於cle...

PAT乙級1055題解

1055 集體照 25 分 拍集體照時隊形很重要,這裡對給定的 n 個人 k 排的隊形設計排隊規則如下 每排人數為 n k 向下取整 多出來的人全部站在最後一排 後排所有人的個子都不比前排任何人矮 每排中最高者站中間 中間位置為 m 2 1,其中 m 為該排人數,除法向下取整 每排其他人以中間人為軸...