演算法提高 金陵十三釵

2021-08-16 17:42:25 字數 1419 閱讀 2949

problem description

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

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

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

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

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

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

sample input
4

97 91 68 14

8 33 27 92

36 32 98 53

73 7 17 82

sample output
思路
狀態壓縮dp

因為最多只有13個學生,每個學生用一位二進位制表示,可以壓縮成乙個整數

例如1010 (大->小) 可以表示配對了第二個第四個學生

將學生的下標從0開始計數比較方便,這樣1<< i就代表第i個學生了。

可以根據配對了幾個學生選擇第幾個女人來配對,這樣就能降一維了。

例如:1010配對了兩個學生,可以由第乙個女人和第二個學生配對轉移過來,也可以由第乙個女人和第四個學生轉移過來

#include

#include

#include

#include

using

namespace

std;

int a[15][15], dp[8200];

int main()

for (int j = 0; j < n; j++)

if (s & (1

dp[s] = max(dp[s], dp[s^(1

<1

<1]0;}

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

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

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

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

演算法提高 金陵十三釵 狀態亞索DP

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