洛谷1514 引水入域 dp 記憶化搜尋

2022-05-20 12:26:09 字數 1767 閱讀 7260

題意大致是:給定乙個(n,m)的數值矩陣,可以在第一行建造水庫,如果乙個格仔周圍的某格仔值小於它,那水就可以流到它周圍的那個格仔,問需要在第一行建造多少水庫使得最後一行能夠被完全覆蓋,如果不能完全覆蓋就求出不能覆蓋的格仔的數量。

主要思路就是在第一行每個點出發的水能到達第n行的區間可以獲得(可以用反證法證明每個點出發的水如果能到達第n行那麼它的覆蓋區間一定是連續的),如果能夠完全覆蓋第n行則用最小區間數覆蓋可以求出最少需要多少個點可以覆蓋第n行,

**如下:

1 #include2

using

namespace

std;

3 typedef unsigned int

ui;4 typedef long

long

ll;5 typedef unsigned long

long

ull;

6#define pf printf

7#define mem(a,b) memset(a,b,sizeof(a))

8#define prime1 1e9+7

9#define prime2 1e9+9

10#define scand(x) scanf("%llf",&x)

11#define f(i,a,b) for(int i=a;i<=b;i++)

12#define scan(a) scanf("%d",&a)

13#define dbg(args) cout<<#args<<":"<14

#define pb(i) push_back(i)

15#define ppb(x) pop_back(x)

16#define inf 0x3f3f3f3f

17#define maxn 1005

18int

n,m,t,a[maxn][maxn],l[maxn][maxn],r[maxn][maxn],vis[maxn][maxn];

19//

l[i][j]從(i,j)位置出發的水最多能覆蓋到最後一行的左端的位置,

20//

r[i][j]從(i,j)位置出發的水最多能覆蓋到最後一行的最右端的位置

21int dir[2]=,,,};

22void dfs(int x,int

y)23

36 l[x][y]=min(l[x][y],l[xx][yy]);

37 r[x][y]=max(r[x][y],r[xx][yy]);38}

39}40int

main()

4152

mem(l,inf);

53 mem(r,-inf);

54 f(1,1

,m)55

58 f(i,1

,m)59

63bool flag=true;64

int cnt=0

;65 f(i,1

,m)6672}

73if(!flag)

7477

else

7889 left=maxr+1

;90 num++;

91}

92 pf("

1\n%d\n

",num);

93/*

f(i,1,m)

94*/97}

98return0;

99 }

洛谷 1514 引水入城

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

洛谷 P1514 引水入城(記憶化搜尋 貪心)

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

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

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