首先是這週主要是做搜尋啊模擬啊什麼的,感覺沒有找到什麼能寫的東西,但是現在困得不行,也不想閒著,就找了一題來記一下。
這個題是搜尋+動規,思路是用搜尋找到湖邊的每乙個點到沙漠邊能覆蓋幾座城,這是乙個線段覆蓋,那麼問題就轉換成了憑每個線段覆蓋的範圍找出最少需要的線段數量,那麼就交給dp來完成。
思路有了,接下來就是實現,這也是我為什麼記下這題的原因,題解裡有一篇手寫佇列的廣搜寫法,我覺得是值得借鑑的,甚至可以當作學習樣本。
void bfs(int sx, int sy) //開始了,手寫佇列,sx和sy表示s初始位置的座標
vis[sx][sy] = 1;
start = 1, ending = 2; //初始化隊首,隊尾
gkd[1].x = sx, gkd[1].y = sy;
while(start < ending)
gkd[ending].x = nx;
gkd[ending].y = ny; //更新隊尾的位置
vis[nx][ny] = 1;
ending++; //下乙個佇列元素}}
}start++; //更新隊首序號
}}
然後貼一下全**吧,其實也就多了主函式和dp函式,注釋說話
#include#define maxn 505
#define maxm 1000005
#define for(a, b, c) for(int a=b; a<=c; a++)
#define hrdg 1000000007
#define inf 2147483647
#define llinf 9223372036854775807
#define ll long long
#define pi acos(-1.0)
#define ls p<<1
#define rs p<<1|1
using namespace std;
int n, m, cnt, start, ending;
int vis[maxn][maxn], map[maxn][maxn]; //走圖用陣列
int f[maxn][maxn], dp[maxn]; //dp用陣列
int flag[maxn]; //標記能不能到
int dx[5] = ;
int dy[5] = ; //方向陣列
struct node1
a[maxn]; //記錄當前點最左最右能去到哪
struct node2
gkd[maxm]; //佇列陣列
inline int read()
while(c>='0'&&c<='9')
return x*f;
}void bfs(int sx, int sy) //開始了,手寫佇列
vis[sx][sy] = 1;
start = 1, ending = 2; //初始化隊首,隊尾
gkd[1].x = sx, gkd[1].y = sy;
while(start < ending)
gkd[ending].x = nx;
gkd[ending].y = ny; //更新隊尾的位置
vis[nx][ny] = 1;
ending++;}}
}start++; //更新隊首序號
}}void dp_d***()
for(k, 1, m)
if(a[k].r != 0)
for(i, a[k].l, a[k].r)
for(j, i, a[k].r)
for(i, 1, m) //dp找到前m個最少需要的水廠
for(j, 1, i-1)
dp[i] = min(dp[i], dp[j]+f[j+1][i]);
}int main()
for(i, 1, m)
if(a[i].vis) //之後在bfs過程**現首行元素和另乙個首行元素相連,那麼之後沒必要再去搜尋另乙個
bfs(1, i);
for(i, 1, m) //檢索有多少沒能夠到的
if(flag[i]==0)
cnt++;
if(cnt!=0) //如果有,輸出並結束總程式
dp_d***();
printf("1\n%d", dp[m]);
return 0;
}
其實這題除了手寫佇列值得學習之外,我還發現最近遇到的很多搜尋題都會跟dp掛上鉤,之後好好學dp吧嘔…… P1514 引水入城
先用dfs搜尋,從最上面的一行往下拓展,所有點拓展完後,掃瞄最後一行是否有沒被染上色的,有則說明 不能滿足要求 如果沒有,在用dfs,計算出最上面一行的每個點 大於等於兩邊的點 能拓展到的最左端和最右端,然後就轉化成了區間覆蓋問題。區間覆蓋問題是給你幾個區間,然後給你乙個大區間,用盡量少的小區間來覆...
P1514 引水入城
在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠...
P1514 引水入城
在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠...