馬農???(窮舉 雜湊)

2021-08-03 07:44:31 字數 1595 閱讀 2186

演算法課上的一道作業。

在**完戰馬檢閱之後,來自大草原的兩兄弟決心成為超級」馬農」,專門飼養戰馬。兄弟兩回到草原,將可以養馬的區域,分為n*n的單位面積的正方形,並實地進行考察,歸納出了每個單位面積可以養馬所獲得的收益。接下來就要開始規劃他們各自的馬場了。首先,兩人的馬場都必須是矩形區域。同時,為了方便兩人互相照應,也為了防止馬匹互相走散,規定兩個馬場的矩形區域相鄰,且只有乙個交點。最後,互不認輸的兩人希望兩個馬場的收益相當,這樣才不會影響他們兄弟的感情。現在,兄弟兩找到你這位設計師,希望你給他們設計馬場,問共有多少種設計方案。

第一行乙個整數n,表示整個草原的大小為n*n。接下來n行,每行n個整數a(i,j),表示第i行第j列的單位草地的收成。(注意:收益可能是負數,養馬也不是包賺的,馬匹也可能出現生病死亡等意外。)n<=50, -1000

輸出符合兩人要求的草原分配方案數。

思路:窮舉每個矩形的交點,每個交點會把整個區域劃分成四塊,如下圖

①區域對應④區域,③區域對應②區域。分別窮舉每個區域裡的矩形,注意矩形的乙個頂點一定為交點。然後用雜湊記錄收益值,找出對應區域相等收益的個數(這裡t了一發,因為本人很懶一般不寫雜湊,直接用map做)。還有乙個優化,在**注釋裡面有介紹。

下面是**:

#include

#include

#include

#include

#include

#include

#define ll long long

#define m 2500000

using namespace std;

int n,sum[55][55];

int ans,x,tmp,top;

int h[m*2+10],st[55*55];

int main()

}for(int i=1;ifor(int j=1;j//這兩個for窮舉了交點

}for(int k=i+1;k<=n;k++)

}while(top) //這裡用了乙個堆疊記錄雜湊的個數,直接清空對應的

h[st[--top]]=0; //如果直接清空整個陣列,應該是會超時的

for(int k=i+1;k<=n;k++)

}for(int k=1;k<=i;k++)

}while(top)

h[st[--top]]=0;

}//cout

printf("%d\n",ans);}}

洛谷 P2363 馬農

題目描述 分別列舉兩個矩陣?那樣n 6太要命了。可以列舉兩個矩形的交點 將交點看成原點,可以將整個區域分成四個象限,1與3對應,2與4對應 再列舉相對應的象限計算可以獲得的利益,用hash判重 可列舉不同的象限時還要把hash清零,n 2次的memset就超時了。那怎麼繼續優化呢?可以用乙個棧記錄h...