莫莉斯·喬是聖域裡乙個叱吒風雲的人物,他憑藉著自身超強的經濟頭腦,牢牢控制了聖域的石油市場。
聖域的地圖可以看成是乙個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。...