狀壓DP入門 傳球遊戲之最小總代價

2022-05-07 04:12:07 字數 1510 閱讀 4529

本人水平有限,題解不到為處,請多多諒解

本蒟蒻謝謝大家**

題目:time limit: 1 sec  memory limit: 128 mb

submit: 89  solved: 43

[submit][status][web board]

n個人在做傳遞物品的遊戲,編號為1-n。遊戲規則是這樣的:開始時物品可以在任意一人手上,他可把物品傳遞給

其他人中的任意一位;下乙個人可以傳遞給未接過物品的任意一人。即物品只能經過同乙個人一次,而且每次傳遞

過程都有乙個代價;不同的人傳給不同的人的代價值之間沒有聯絡;求當物品經過所有n個人後,整個過程的總代

價是多少。 

第一行為n,表示共有n個人(16>=n>=2); 

以下為n*n的矩陣,第i+1行、第j列表示物品從編號為i的人傳遞到編號為j的人所花費的代價,

特別的有第i+1行、第i列為-1(因為物品不能自己傳給自己),其他資料均為正整數(<=10000)。 

乙個數,為最小的代價總和。 

2

-1 9794

2724 –1

2724
f[i][j]表示在當前狀態下的以j結尾需要的最小代價總和;

dis[i][j]表示以i開始,以j結尾的距離;

讀入時可以手動把n=-1給特判掉;

初始化:for(i=1 to down n)  f[1<

轉移:f[i][j]=min(f[i][j],f[i^1<

結尾:for(i=1 to down (1<

code:

#includeusing

namespace

std;

intn;

int dis[21][21

];int

ans;

int f[1

<<20][21

];inline

intread()

while(ch>='

0'&&ch<='9'

)

return x*f;

}inline

void write(int

x)

while(cnt>0)putchar(f[--cnt]) ;

}int

main()

}memset(f,

0x3f,sizeof

(f));

for(int i=1;i<=n;i++)

f[1<1][i]=0

;

for(int i=1;i<=(1

<1;i++)}}

}}

for(int i=1;i<=n;i++)

ans=min(ans,f[(1

<1

][i]);

write(ans);

}cout

0;

}

狀壓DP入門

洛谷題號p1896 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。題解 首先暴搜可肯定是超時的所以我門考慮狀壓 因為每個數都可以用二進位制表示出來 二進位制中01可以表示當前行放的棋子的位置 以及...

狀壓DP入門

首發於摸魚世界 狀壓dp,即狀態壓縮dp,它的精髓在於把dp過程中的乙個 狀態 用乙個二進位制數巧妙的表示出來。接下來就從一些入門的狀壓題目來感受一下狀壓的魅力吧 洛谷p5911 poi2004 prz 大致題意 n 個人過最大承載 w 重量的橋,每個人有重量 w i 與過橋時間 t i 多人一組時...

狀壓DP入門題

學習狀壓之前必須要熟練掌握位運算 位運算名 符號效果 and 按位與如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0 l or 按位或兩個相應的二進位制位中只要有乙個為1,該位的結果值為1 xor 按位異或 單身狗操作 若參加運算的兩個二進位制位值相同則為0,否則為1 取反 一元運算子,...