狀壓DP 拯救莫莉斯

2022-03-27 08:32:44 字數 1534 閱讀 1700

時間限制: 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

有點類似那個奶牛翻瓦片的問題傳送門 ,因為m

f[i+1][j][k]=min(f[i][h][j]+val[i+1][k]);  val表示第i+1行選k狀態時耗費。

多維護乙個g陣列,就有了最小個數了。

那麼啥時候能推到下一行呢?

f[i+1][j][k]和f[i][h][j]  則(h|k|k|k<<1|k>>1)&(2^m-1)==2^m-1就說明i這一行已經全部覆蓋了。

最後乙個。。乙個問題(很嚴重)初始化和最後輸出,我太菜初始化想了半天,旁邊ltr大佬一遍想出。。%%%

初始化   f[1][0][i]=balabala()

輸出     max(f[n+1][i][0]);

#include#include#include#include#include#includeusing namespace std;

int read()

while(x>='0'&&x<='9')

return sum*f;

}int n,m,a[55][55],v[55][(1<<7)+2],ans=10000000,cnt=100;

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

int get(int x)

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

else

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

cnt=min(g[n+1][i][0],cnt);

cout<

拯救莫莉斯

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

GDOI2014 拯救莫莉斯

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