LG4003 無限之環 題解

2022-09-26 04:51:09 字數 2483 閱讀 8084

狀態壓縮,動態規劃。

碎碎念:

考場上看到這個題的一瞬間想到了要費用流,但是不會建圖。

剛剛準備自閉的時候突然發現好像可以狀態壓縮。

狀壓打完了發現這玩意狀態好少啊……

果然拿個 map 存一下就過了……

題面給定乙個 \(n \times m\) 的網格圖,有 \(15\) 種形狀的水管排布在裡面,需要這些水管互相相連,每次可以轉動 \(90^\circ\),求最少的操作次數。

\(\texttt: n\times m \leq 2\times 10^3\).

對於本題的費用流解法筆者不想在這裡贅述,這個地方討論的是本題的狀態壓縮解法。

我們很容易想出來乙個 \(o(nm2^)\) 的部分分做法,也就是本題 40pts 的部分分,也就是用輪廓線 dp 來轉移狀態,可以設乙個 01 狀態為乙個棋盤的輪廓線形狀,令 \(2^i\) 為第 \(i\) 個位置是否有向下插的管子,\(2^0\) 為有沒有向右插的管子,然後直接轉移就可以做出部分分了。

但是筆者在考場上寫不出費用流的情況下寫了乙個狀態壓縮,然後仔細一想……

初始狀態乙個,轉移出來的狀態難道會很多嗎?

於是不嚴謹的估計了一下我們題目所能夠轉移出來的狀態數量,我們粗略的考慮每一種情況會轉移出多少種狀態以及其可以接受多少種合法的狀態。

不難發現乙個格仔只能接受最多四種與其直接相關的狀態,也就是其上面有沒有管子,其左邊有沒有管子這四種狀態,我們用 \(0/1,0/1\) 來表示這些狀態。

再對於所有的情況分類討論,

乙個介面的統一討論。不難發現其可以接受 \(01,10,00\) 這 \(3\) 種狀態,對於前兩種狀態,其只能匯出乙個狀態。對於最後乙個狀態可以匯出 \(2\) 種狀態。所以這個情況可以是狀態增加點,也可以是狀態減少點

對於乙個槓槓的分別只能接受一種狀態和匯出一種狀態,所以一定是狀態減少點

對於乙個彎道的情況統一討論,不難發現其可以接受所有的狀態,但是對於每種狀態只能匯出一種狀態,所以是狀態不變點,只會對答案造成影響。

對於乙個三個道的情況統一討論,不難發現其可以接受 \(10,01,11\) 這三種狀態。相同的,對於前兩種狀態只能匯出一種狀態,最後乙個可以匯出兩種狀態,所以是即是狀態增加點,也是狀態減少點

對於十字路口,其只能接受一種狀態並且匯出一種狀態,所以一定是狀態減少點

最後我們發現了,只有 \(1\) 情況和 \(4\) 情況會增大狀態。

我們大膽猜測,他的資料很扯淡,所以你用個 map 存一下狀態然後就過了……還跑的飛快。

實際上我們想要卡這個做法也非常簡單,只用第一行全都是第一種狀態就可以把這個做法卡到上界,但是實際上估計出題人實在是沒有想到還有這種人類智慧型做法,所以壓根沒卡。

事實上 uoj 上面有資料 hack 了這種做法,還是希望大家練習的時候多學正解考試的時候多寫亂搞,這樣就可以提高自己的實力了!

給出我亂搞的**。

using ll = long long;

const int inf = 1e9;

const int n = 2e3 + 10 ;

int n, m;

int a[n][n];

bool up(const int x)

bool ri(const int x)

bool dn(const int x)

bool le(const int x) //上下左右

int l90(const int x)

int r90(const int x)

int t18(const int x) //旋轉

bool sps(const int x) //直線型特判

int b[n][n];

void rotate()

inline void input()

inline ll to(ll x, ll s, int pos)

unordered_mapf, g;

inline void work()

if(sps(w)) continue;

tem = to(l90(w), s, j);

if(~tem)

tem = to(r90(w), s, j);

if(~tem)

tem = to(t18(w), s, j);

if(~tem)

}f.clear(), f.swap(g);

}auto it = f.insert(make_pair(0, inf));

if(it.second) cout << -1 << '\n';

else cout << it.first->second << '\n';

return ;

}inline void solve()

P4003 無限之環

題面自己看吧。std對於這種毒瘤的最小費用匹配問題,一般考慮網路費用流。對於每個水管的每乙個支管,有且僅有乙個其它方格上的水管的其中乙個支管與其相連,這樣就不會漏水了,也就是乙個水管的每個支管容量只能為 1 且都要滿流。由於我們要用網路流,又考慮到只有相鄰的兩個水管又可能產生流量,於是考慮將圖黑白染...

洛谷P4003 無限之環 費用流

曾經有一款流行的遊戲,叫做 infinity loop,先來簡單的介紹一下這個遊戲 遊戲在乙個n m n m的網格狀棋盤上進行,其中有些小方格中會有水管,水管可能在 格某些方向的邊界的中點有介面,所有水管的粗細都相同,所以如果兩個相鄰方格的 共邊界的中點都有接頭,那麼可以看作這兩個接頭互相連線。水管...

清華集訓 2017 無限之環

無限之wa 本題如果知道是網路流的話,其實建圖不算特別神奇,但是比較麻煩。資料範圍過大,插頭dp不能處理,而且是乙個網格圖,考慮網路流。先看是不是二分圖?每個格仔只會和相鄰四個格仔發生關係 所以,黑白染色正好。i j為偶數左部點,i j為奇數右部點 不漏水是什麼?每個管道的四個口都能和別的接好。s向...