注意這道題只能用dfs而不能直接用dp,因為在每乙個格仔,沒有固定的方向,而是上下左右都可以走。但其中有dp的思想:不斷更新l和r。
這道題中首先判斷乾旱區所有的城市能否都能建有水利工程。則先讓第一行的每乙個城市都有水利工程,然後進行遍歷,看最後一行的所有點能不能都被走到,如果有走不到的,則說明不行,記錄走不到的個數,輸出即可。
如果都能走到,則需要考慮第一行選哪幾個使得能將最後一行全部覆蓋過來。那麼在剛才遍歷的時候,可以不斷更新l,r(詳見**),直到從l[n]和r[n]更新至l[1]和r[1]。現在l[1][i]和r[1][i]中分別存第一行第i個如果選的話,能灌溉最後一行[l,r]這個區間的城市。然後用線段覆蓋思想來做即可。(詳見while)
ac**:
1 #include2 #include3 #include4ac**using
namespace
std;
5const
int n=505;6
intn,m;
7int
vis[n][n],g[n][n],l[n][n],r[n][n];
8int _x[4]=;
9int _y[4]=;
10bool judge(int x,int
y)15
void dfs(int x,int
y)25}26
intmain()39}
40if
(flag)
44int low=1;45
while(low<=m)
50 ans++;
51 low=maxx+1;52
}53 printf("
1\n%d
",ans);
54return0;
55 }
洛谷P1514 引水入城 dfs
題目 搜尋 dp 自己想出來的方法第一次80分好高興!再改了改就a了,狂喜亂舞 也就是 dfs,仔細一想第一行的每個點能覆蓋到最後一行的點一定是連續的一段,否則沒人能覆蓋中間間斷的點 所以最上面每個點跑一遍 dfs,記下能覆蓋區間的 l 和 r,再小小dp一下即可。如下 include includ...
洛谷 P1514 引水入城
題目描述 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水...
洛谷 P1514 引水入城
題目概述 給定乙個n m的矩陣,每個格仔代表高度,水只能向低處流。從最上面一排倒水,問最下面一排的每個格仔是否都有水流過。若是,輸出最少需在幾個格仔上倒水,若否,則輸出最下面一排有幾個格仔接不到水。解題思路 可以證明,如果底排每個格仔都有水,那麼從頂部每個格仔倒下的水,在底部形成的一定是乙個連續的區...