莫莉斯·喬是聖域裡乙個叱吒風雲的人物,他憑藉著自身超強的經濟頭腦,牢牢控制了聖域的石油市場。考試打的爆搜,本來能騙35分的,結果生給ce(編譯錯誤)掉了,重要的是本機跑啥事沒有,簡直了聖域的地圖可以看成是乙個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
正解:一看資料範圍就知道是狀壓
首先分析資料範圍,
且,顯然可以推出
,那麼剩下的就很好辦了,我們可以壓每一行的狀態
然後我們再看,第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狀態可取,需使第i行的所有城市滿足要求,即:][l];
g[i+1][k][l]=g[i][j][k]+num[i+1][l];
((j|l|k|(k<<1)|(k>>1))&(bin[m]-1))==bin[m]-1那麼答案就是 max(f[n+1][x][0])
這裡需要注意的是,陣列不能卡著數開,因為我們的答案儲存在n+1中,所以最好多開一點,以防越界
1 #include2 #include3 #include4view codeusing
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 }
拯救莫莉斯
莫莉斯 喬是聖域裡乙個叱吒風雲的人物,他憑藉著自身超強的經濟頭腦,牢牢控制了聖域的石油市場。聖域的地圖可以看成是乙個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,...