拯救莫莉斯

2022-04-29 21:15:12 字數 2200 閱讀 8753

一道考試題:然而誰會想到我考試的時候打了乙個最小費用最大流??

真是弱爆了。。。

時間限制: 1 sec  記憶體限制: 256 mb

莫莉斯·喬是聖域裡乙個叱吒風雲的人物,他憑藉著自身超強的經濟頭腦,牢牢控制了聖域的石油市場。

聖域的地圖可以看成是乙個n*m的矩陣。每個整數座標點(x , y)表示一座城市(1<=x<= n, 1<=y<=m)。兩座城市間相鄰的定義為:對於城市(ax, ay)和城市(bx, by),滿足(ax - bx)2 + (ay - by)2 = 1。

由於聖域的石油**總量很大,莫莉斯意識到不能讓每筆石油訂購單都從同乙個油庫裡發貨。為了提高效率,莫莉斯·喬決定在其中一些城市裡建造油庫,最終使得每乙個城市x都滿足下列條件之一:

1.該城市x內建有油庫,

2.某城市y內建有油庫,且城市x與城市y相鄰。

與地球類似,聖域裡不同城市間的地價可能也會有所不同,所以莫莉斯想讓完成目標的總花費盡可能少。如果存在多組方案,為了方便管理,莫莉斯會選擇建造較少的油庫個數。

第一行兩個正整數n,m ( n * m <= 50 且m<=n),表示矩陣的大小。

接下來乙個n行m列的矩陣f,fi, j表示在城市(i,j)建造油庫的代價。

輸出兩個數,建造方案的油庫個數和方案的總代價。

輸入樣例:

輸出樣例:

3 36 5 4

1 2 3

7 8 9

3 6對於30%資料滿足 n * m <= 25;

對於100%資料滿足n * m <= 50; 0 <= fi, j <= 100000

因為是考試題,一定要詳細點::

首先讀到題時要認真審題,是n*m<=50!!當你真真正正的理解題了後,忽然發現,這就是個狀壓啊~

設f[i][j][k]陣列儲存的是最小的花費,第一維代表前i行,第二維代表上一行的狀態,第三維代表這一行的狀態。

預處理出cost[i][j]陣列代表在第i行時選取狀態j時的花費;

所以很容易得出狀態轉移方程:f[i][k][u]=min(f[i][j][k]+cost[i][u]);

經過嚴密的調查發現因為每乙個城市至少要有乙個油庫與之相鄰,所以這個狀態能夠轉移過來的前提是(i | j | u | k<<1| k>>1)&(1因為轉移到第n行時有兩維狀態不確定,所以我們轉移到第n+1行;

在轉移f陣列時同時維護乙個g陣列代表最小個數就好了!!

希望下回能ac( ⊙ o ⊙ )啊!(來自蒟蒻的祈望~~)

1 #include2 #include3 #include4 #include5

using

namespace

std;

6int

read()

10return

sum;11}

12int

n,m;

13int v[52][52],cost[52][1

<<8],sum[1

<<8

];14

int f[52][1

<<8][1

<<8],g[52][1

<<8][1

<<8

];15 inline int

get(int

zt)20 inline int get_sum(int

zt)26

return

num;27}

28void

st()

34for(int i=0;i<1

35 sum[i]=get_sum(i);36}

37void

dp()

42for(int i=1;i<=n;++i)

43for(int j=0;j<1

上一列的狀態

44for(int u=0;u<1

這一列的狀態

45if(f[i][j][u]>100000000) continue;46

for(int p=0;p<1

下一列的狀態

47if(((j|u|p|(u>>1)|(u<<1))&((1

<1))==((1

<1

))52

else56}

57}58}

59}60int

main()78}

79 printf("

%d %d\n

",res,ans);

80return0;

81 }

拯救莫莉斯

莫莉斯 喬是聖域裡乙個叱吒風雲的人物,他憑藉著自身超強的經濟頭腦,牢牢控制了聖域的石油市場。聖域的地圖可以看成是乙個n m的矩陣。每個整數座標點 x y 表示一座城市 1 x n,1 y m 兩座城市間相鄰的定義為 對於城市 ax,ay 和城市 bx,by 滿足 ax bx 2 ay by 2 1。...

狀壓DP 拯救莫莉斯

時間限制 1 sec 記憶體限制 256 mb 莫莉斯 喬是聖域裡乙個叱吒風雲的人物,他憑藉著自身超強的經濟頭腦,牢牢控制了聖域的石油市場。聖域的地圖可以看成是乙個n m的矩陣。每個整數座標點 x y 表示一座城市 1 x n,1 y m 兩座城市間相鄰的定義為 對於城市 ax,ay 和城市 bx,...

GDOI2014 拯救莫莉斯

莫莉斯 喬是聖域裡乙個叱吒風雲的人物,他憑藉著自身超強的經濟頭腦,牢牢控制了聖域的石油市場。聖域的地圖可以看成是乙個n m的矩陣。每個整數座標點 x y 表示一座城市 1 x n,1 y m 兩座城市間相鄰的定義為 對於城市 ax,ay 和城市 bx,by 滿足 ax bx 2 ay by 2 1。...