在平面上有n個點,現在要把他們拼成n/2對,拼接兩個點的代價是他們的平面距離,現在問代價總和最小是多少
4
8730 9323
-3374 3929
-7890 -6727
1257 4689
20366.60
2<=n<=20
用dfs每一次選1個數和當前數字匹配,如果當前數字選過了,就進入下一層
#include
#include
#define min(a,b) (a)<(b)?(a):(b)
using
namespace std;
int n,p[30]
;double ans,x[30]
,y[30];
double
dis(
int a,
int b)
//計算
void
dfs(
int dep,
double sum)
if(sum>=ans)
return
;//無法更新答案了
if(p[dep]
)dfs
(dep+
1,sum)
;//選過就直接下一層
else}}
intmain()
用bfs先造出乙個狀壓模型,然後用模型進行狀壓dp
#include
#include
#include
#include
#define min(a,b) (a)<(b)?(a):(b)
using
namespace std;
int n,tail=
1,q[
1<<21]
;double x[30]
,y[30
],f[
1<<21]
;intpd(
int x,
int y)
double
dis(
int a,
int b)
void
bfs(
)//製造模型
}voiddp(
)}intmain()
最優配對問題(集合上的動態規劃) 狀壓DP
題意 給出n個點的空間座標 n為偶數,n 20 把他們配成n 2對,問 怎樣配對才能使點對的距離和最小?題解 設dp s 為 狀態為s s代表著某個子集 時,它的最小距離和。1.對於乙個狀態s,首先要計算它減少兩個點後的狀態的最小距離和,然後當前狀態才能從這些狀態中轉移過來。2.如何轉移 對於狀態s...
jzoj 3420 最優配對問題
平面上有n個點p1,p2,pn,你的任務是把它們配成n 2對 n是偶數 使得每個點恰好在乙個點對中。所有點對中兩點的距離之和應盡量小。n 20,xi yi 10000。第一行輸入n 2到20之間的偶數 接下來n行,每行輸入兩個整數表示xi,yi。xi yi 10000。輸出最小配對距離。答案保留兩位...
JZOJ4743 積木 狀壓dp
顯然是狀壓dpdp dp。設f s i 1.3 f s i 1.3 f s i 1.3 表示使用的積木集合是s ss,最後使用的是積木i ii,是以長 寬 高維度往上的最高值。列舉s ss,再列舉最近放置的積木i ii和接下來要放置的積木j jj。然後再列舉使用哪一維往上搭。轉移方程過於顯然了吧。也...