[蓝桥杯][算法提高VIP]金陵十三钗(状压dp记忆化搜索)
題目描述
在電影《金陵十三釵》中有十二個秦淮河的女人要自我犧牲代替十二個女學生去赴日本人的死亡宴會。為了不讓日本人發現,自然需要一番喬裝打扮。但由于天生材質的原因,每個人和每個人之間的相似度是不同的。由于我們這是編程題,因此情況就變成了金陵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列。
輸出
僅一行,一個整數,表示可獲得的最大相似度。
樣例輸入
4
97 91 68 14
8 33 27 92
36 32 98 53
73 7 17 82
樣例輸出
354
思路:很容易想到的是類似于n皇后問題那樣,去挨個位置的去試,這樣的時間復雜度是O(n!),n<=10的數據量是可以的,但是n>10的時候就不行了。n的數據量很少,因此我們可以采用狀壓的方法,將選擇的狀態利用二進制串的方式表達出來。拿樣例來說,假如選擇了1,2,4列的話,表達為二進制串就是11010.然后利用記憶化搜索,遇見重復的情況就可以直接返回了,大大減少了時間復雜度。
代碼如下:
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的[蓝桥杯][算法提高VIP]金陵十三钗(状压dp记忆化搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: INVZI 为苹果 iMac 推出底座扩
- 下一篇: [蓝桥杯][算法提高VIP]Sharin