GDOI2014 拯救莫莉斯

2022-03-27 10:56:14 字數 2331 閱讀 9989

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

聖域的地圖可以看成是乙個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

考試打的爆搜,本來能騙35分的,結果生給ce(編譯錯誤)掉了,重要的是本機跑啥事沒有,簡直了

正解:一看資料範圍就知道是狀壓

首先分析資料範圍,

且,顯然可以推出

,那麼剩下的就很好辦了,我們可以壓每一行的狀態

然後我們再看,第i行的狀態只會對第i-1行至第i+1行產生影響

那麼我們就只需要記錄一下每一行和它上一行的狀態就可以了

設:f[i][j][k]為對於前i行,第i-1行狀態為j,第i行狀態為k,對於任何一行x(x設:g[i][j][k]記錄在上述條件下對應f[i][j][k]方案裡的油庫數量

然後我們可以預處理出每一行的狀態所對應的代價與油庫數量(設cost[i][j]為第i行,狀態為j時所需代價,num[i][j]為第i行狀態為j時的油庫數量)

那麼我們可以很輕鬆的寫出狀態轉移方程:

f[i+1][k][l]=f[i][j][k]+cost[i+1

][l];

g[i+1][k][l]=g[i][j][k]+num[i+1][l];

而其中,l狀態可取,需使第i行的所有城市滿足要求,即:

((j|l|k|(k<<1)|(k>>1))&(bin[m]-1))==bin[m]-1
那麼答案就是 max(f[n+1][x][0])

這裡需要注意的是,陣列不能卡著數開,因為我們的答案儲存在n+1中,所以最好多開一點,以防越界

1 #include2 #include3 #include4

using

namespace

std;

5 inline int

read()

12int

n,m;

13int bin[8

];14

int w[55][10

];15

int g[55][1

<<7][1

<<7],f[55][1

<<7][1

<<7],cost[55][1

<<7],num[55][1

<<7

];16

intmain()

35/*

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

36for(int j=0;j37

cout

38for(int i=0;i)

39 f[0][i][0]=0;40

for(int i=0;i<=n;i++)

41for(int j=0;j)

42for(int k=0;k)

43for(int l=0;l)50}

51int ans(0x7fffffff),ji;//

cout<52

for(int i=0;i//

cout<53

if(f[n+1][i][0]==ans)

54if(ji>g[n+1][i][0

])55 ji=g[n+1][i][0

];56

if(f[n+1][i][0]//

cout<57 ans=f[n+1][i][0

];58 ji=g[n+1][i][0

];59}60

}61 printf("

%d %d

",ji,ans);

62 }

view code

拯救莫莉斯

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

拯救莫莉斯

一道考試題 然而誰會想到我考試的時候打了乙個最小費用最大流?真是弱爆了。時間限制 1 sec 記憶體限制 256 mb 莫莉斯 喬是聖域裡乙個叱吒風雲的人物,他憑藉著自身超強的經濟頭腦,牢牢控制了聖域的石油市場。聖域的地圖可以看成是乙個n m的矩陣。每個整數座標點 x y 表示一座城市 1 x n,...

狀壓DP 拯救莫莉斯

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