拯救莫莉斯

2021-08-05 19:20:49 字數 1865 閱讀 7986

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

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

考試的時候一看這題,就想用費用流水過去,一開始過了樣例,感覺很對的想法,後來發現邊建錯了,各種調都沒能調出來,果然,考試的時候先打個暴力很重要的

f[i][j][k]表示前i位,i-1位狀態為j,i位狀態為k時最小花費,這裡的狀態表示建油庫的狀態,

f[i+1][k][x]=f[i][j][k] (x|k|j|k>>1|k<<1)&((1<

對於0-》1的轉移特殊處理,並不需要滿足上面的條件

最後要特別注意

優先順序

#include#include#include#define inf 100000000

using namespace std;

int n,m;

int a[55][55],cost[55][(1<<8)+5],cnt[(1<<8)+5];

int f[55][(1<<8)+5][(1<<8)+5],g[55][(1<<8)+5][(1<<8)+5];

void turn(int x,int n)

; int num=0;

while(x)

for(int i=n;i>num;i--) cout<<"0";

for(int i=num;i>=1;i--) cout<>1))&((1else

if(f[i+1][k][x]==f[i][j][k]+cost[i+1][x])}}

else

else

if(f[i+1][k][x]==f[i][j][k]+cost[i+1][x])

g[i+1][k][x]=min(g[i+1][k][x],g[i][j][k]+cnt[x]);

}int ans=0x7fffffff;

int cnt=0;

for(int i=0;i<(1else if(ans==f[n+1][i][0]) cnt=min(cnt,g[n+1][i][0]);

}printf("%d %d",cnt,ans);

//while(1);

return 0;

}

拯救莫莉斯

一道考試題 然而誰會想到我考試的時候打了乙個最小費用最大流?真是弱爆了。時間限制 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,...

GDOI2014 拯救莫莉斯

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