藍橋 金陵十三釵 狀壓 記憶化搜尋

2021-10-04 22:20:19 字數 1389 閱讀 8359

題目描述

在電影《金陵十三釵》中有十二個秦淮河的女人要自我犧牲代替十二個女學生去赴日本人的死亡宴會。為了不讓日本人發現,自然需要一番喬裝打扮。但由於天生材質的原因,每個人和每個人之間的相似度是不同的。由於我們這是程式設計題,因此情況就變成了金陵n釵。給出n個女人和n個學生的相似度矩陣,求她們之間的匹配所能獲得的最大相似度。

所謂相似度矩陣是乙個n*n的二維陣列like[i][j]。其中i,j分別為女人的編號和學生的編號,皆從0到n-1編號。like[i][j]是乙個0到100的整數值,表示第i個女人和第j個學生的相似度,值越大相似度越大,比如0表示完全不相似,100表示百分之百一樣。每個女人都需要找乙個自己代替的女學生。

最終要使兩邊一一配對,形成乙個匹配。請程式設計找到一種匹配方案,使各對女人和女學生之間的相似度之和最大。

輸入

第一行乙個正整數n表示有n個秦淮河女人和n個女學生

接下來n行給出相似度,每行n個0到100的整數,依次對應二維矩陣的n行n列。

輸出

僅一行,乙個整數,表示可獲得的最大相似度。

樣例輸入

497 91 68 14

8 33 27 92

36 32 98 53

73 7 17 82

樣例輸出

354和n皇后類似,只不過對角線可以有。暴力就超時了。

用狀態壓縮,用n為01來表示當前的可選狀態,0表示不可選,1表示可選。

所以對於第一行,所有都可選,也就是全1的狀態。

#include

#include

#include

#include

using

namespace std;

//狀壓+記憶化搜尋

//state的二進位制中1表示當前行的這個位可選

int a[15]

[15];

int dp[15]

[1<<14]

;//dp[i][j]表示第i行選狀態為j的最大值

int n;

intdfs

(int line,

int state)

int maxx=0;

if(line==n-1)

}}else}}

return dp[line]

[state]

=maxx;

}int

main()

}int state=(1

<;printf

("%d"

,dfs(0

, state));

return0;

}

演算法提高 金陵十三釵 狀壓DP

思路 深度搜尋複雜度n!過不了。考慮動態規劃 將已經選擇的列記為1,未選擇表示0,二進位制壓縮,例如110,就表示選擇了第1列和第2列。d i,t 表示當前已經匹配了i行,選擇了t這些列。狀態轉移 for int i 0 i n i 此時總的狀態數就是1 用記憶化搜尋,很好寫。include inc...

藍橋杯演算法提高 金陵十三釵

思路 這道題最基本的做法就是dfs直接暴力破解,這樣的複雜度毫無疑問的o n 是不能完全ac的.那麼,看到這道題問的是最優解,那麼想必跟動態規劃能扯上關係了,但是咋一看,轉移方程可不太好寫,一開始的時候我還寫了個錯的轉移式,妄想能在o n 2 內求解.言歸正傳,使用動態規劃的話,要注意的是 在為第 ...

HDU 4778 記憶化搜尋 狀壓

給出g種寶石,b個包,和s,s代表到時候每種顏色的寶石湊齊s個能變成乙個魔法石 每個包裡有n種寶石,分別為c1,c2.然後兩人輪流拿包,每個包只能拿一次,拿出包把寶石放地上。如果能變成魔法石則拿走魔法石,下一次還這個人拿包,沒變成則換人。魔法石的個數就是獲得分數,問兩人最優的時候分差是多少。狀壓記憶...