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