題目鏈結
分析:
**用極大化思想解決最大子矩陣問題
演算法二的複雜度是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 為該排人數,除法向下取整 每排其他人以中間人為軸...