洛谷P1514 引水入城 記憶化搜尋 線段覆蓋

2021-08-31 18:59:54 字數 1188 閱讀 1095

題目大意:n*m個城市,要求在最後一行的乾旱區所有城市中建設水利設施。水利設施有兩種,一種為蓄水廠,一種為輸水站。第一行城市由於沿海,可以建設蓄水廠。某城市建輸水站的要求是相鄰(上下左右)且高度比自己高的城市建有水利設施(利用高度差輸水)。如果可以全部建成,則輸出最少要建幾個蓄水廠。否則輸出乾旱區中不可能建有水利設施的城市數目。

思路:用結構體dp[x][y]表示點(x,y)可以覆蓋到的範圍[l,r]。在可以全部覆蓋的情況下,先用dfs搜出第一行每個城市可以覆蓋的區域(一定是相連的,否則不通),再用貪心解決線段覆蓋問題,即可得到最小數量。用記憶化搜尋,否則會t:對於已經填過的dp,直接呼叫,無需dfs。

// luogu-judger-enable-o2

#include

using namespace std;

const

int maxn=

500+5;

int dir[4]

[2]=

,,,}

;int n,m,cnt,flag,h[maxn]

[maxn]

,vis[maxn]

[maxn]

;struct node p[maxn]

,s;struct lnode dp[maxn]

[maxn]

;bool cmp

(lnode a,lnode b)

void

dfs(node a)}}

intmain()

}for

(int i=

1;i<=m;i++

)//dp鋪好基層

dp[n]

[i].l=dp[n]

[i].r=i;

for(

int i=

1; i<=m; i++

) flag=1;

for(

int i=

1; i<=m; i++

)// printf("%d %d\n",dp[1][i].l,dp[1][i].r);}if

(!flag)

else

} len=maxl;

cnt++;}

printf

("1\n");

printf

("%d\n"

,cnt);}

}

洛谷 P1514 引水入城

題目描述 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水...

洛谷 P1514 引水入城

題目概述 給定乙個n m的矩陣,每個格仔代表高度,水只能向低處流。從最上面一排倒水,問最下面一排的每個格仔是否都有水流過。若是,輸出最少需在幾個格仔上倒水,若否,則輸出最下面一排有幾個格仔接不到水。解題思路 可以證明,如果底排每個格仔都有水,那麼從頂部每個格仔倒下的水,在底部形成的一定是乙個連續的區...

洛谷P1514 引水入城

想用搜尋水一水,結果一水就是一下午emmm 用第一層的點去更新其他層的點,並記錄能更新到的最遠的端點,然後下面判斷是否最底層都能到達,都能到達就通過記錄的左右端點來更新,使在最少使用的情況下框到最大的範圍就行了 by acermo include include include include in...