題目描述:演算法使用:深度優先搜尋+動態規劃![]()
在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政 區劃十分特殊,剛好構成乙個n行m列的矩形,如上圖所示,其中每個格仔都代表一座城 市,每座城市都有乙個海拔高度。 為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施 有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利用水幫浦將湖泊中的水抽取到所在城市的 蓄水池中。因此,只有與湖泊毗鄰的第1行的城市可以建造蓄水廠。而輸水站的功能則是通 過輸水管線利用高度落差,將湖水從高處向低處輸送。故一座城市能建造輸水站的前提,是 存在比它海拔更高且擁有公共邊的相鄰城市,已經建有水利設施。 由於第n行的城市靠近沙漠,是該國的乾旱區,所以要求其中的每座城市都建有水利 設施。那麼,這個要求能否滿足呢?如果能,請計算最少建造幾個蓄水廠;如果不能,求幹 旱區中不可能建有水利設施的城市數目。
輸入描述:
輸入的每行中兩個數之間用乙個空格隔開。 輸入的第一行是兩個正整數n和m,表示矩形的規模。 接下來n行,每行m個正整數,依次代表每座城市的海拔高度。
輸出描述:
輸出有兩行。如果能滿足要求,輸出的第一行是整數1,第二行是乙個整數,代表最少 建造幾個蓄水廠;如果不能滿足要求,輸出的第一行是整數0,第二行是乙個整數,代表有 幾座乾旱區中的城市不可能建有水利設施。
樣例輸入:
2 5
9 1 5 4 3
8 7 6 1 2
樣例輸出:1 1
思路:
先利用搜尋判斷問題有無解。
預處理:
對於第一行的點通過搜尋求出它能到達的最後一行的所有的點,那麼這些點一定是連續的。證明:如果最後一行的這些點不是連續的設中間不能到達的點為x,則x的高度一定大於它左邊,右邊,上邊的點的高度,這與有解的情況是矛盾的。所以就可以求出第一行的點對應最後一行的區間,並記錄下左右區間。所以問題轉換為了線段覆蓋型的動歸。
#include
using
namespace
std;
const
int maxn=501;
int n,m,num,map[maxn][maxn],f[maxn];
int xx[5]=,
yy[5]=;
bool flag[maxn][maxn],k[maxn];
struct node
a[maxn][maxn];
void dfs(int i,int j)//深搜判斷有無解,計算第一行的點對應的區間
}}int main()
for(int i=1;i<=m;i++)//深搜第一行的點
dfs(1,i);
for(int i=1;i<=m;i++)//根據深搜判斷有無解
if(k[i]==false) num++;
if(num!=0)
f[0]=0;//動態規劃
for(int i=1;i<=m;i++)
for(int j=a[1][i].l;j<=a[1][i].r;j++)
if(f[j]>f[a[1][i].l-1]+1||!f[j])
f[j]=f[a[1][i].l-1]+1;
cout
<
0;}
NOIP2010 引水入城
兩遍bfs floodfill,第一遍bfs可以判斷出最後是輸出0還是輸出1,第二遍bfs floodfill不懂 program flow const dx array 1.4 of 1.1 1,0,1,0 dy array 1.4 of 1.1 0,1,0,1 type atp record x...
NOIP2010 引水入城
4引水入城在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水...
NOIP2010 引水入城
模擬考試的時候因為前面的題耗時太嚴重,所以沒有寫 對於第一行的每乙個城市。我們能夠預處理出在這座城市建立蓄水廠,水流能到達最以下一行的哪些城市 假設終於的題目是有解的,那麼最後一行這些被覆蓋的城市是連續的。反證 假設水流到達最以下一行的城市是斷開不連續的,則說明中間有城市海拔比四周都高,其它城市過來...