演算法提高 金陵十三釵
時間限制:1.0s 記憶體限制:256.0mb
金陵十三釵
本題難度:難
本題占分比例:5%
問題描述
在電影《金陵十三釵》中有十二個秦淮河的女人要自我犧牲代替十二個女學生去赴日本人的死亡宴會。為了不讓日本人發現,自然需要一番喬裝打扮。但由於天生材質的原因,每個人和每個人之間的相似度是不同的。由於我們這是程式設計題,因此情況就變成了金陵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資料規模和約定
對於70%的資料,n<=10
對於100%的資料,n<=13
樣例說明
最大相似度為91+92+93+73=354
題目分析:本題如果直接暴力,複雜度是n!無法全部ac,為了優化時間,採用狀壓dp,我們用dp[i][j]儲存第i個人被替換時狀態為j,這裡的j是二進位制的表示形式,第x個位置為1的話代表第x個人被替換了,所以狀態轉移方程為dp[i][j] = max(dp[i][j],dp[i - 1][j - p] + like[i][t]),p代表只有第x個人的狀態,t代表第x個人的位置,求第x個人的狀態用lowbit.為了節省空間,用滾動陣列代替二維陣列更新狀態
**:
#include#include#include#include#include#include#includeusing namespace std;
int like[15][15],dp[1<<13];
int n;
int lowbit(int x)
int numofone(int x)
return cnt;
}int locofone(int x)
return cnt;
}void work(int x)
藍橋杯演算法提高 金陵十三釵
思路 這道題最基本的做法就是dfs直接暴力破解,這樣的複雜度毫無疑問的o n 是不能完全ac的.那麼,看到這道題問的是最優解,那麼想必跟動態規劃能扯上關係了,但是咋一看,轉移方程可不太好寫,一開始的時候我還寫了個錯的轉移式,妄想能在o n 2 內求解.言歸正傳,使用動態規劃的話,要注意的是 在為第 ...
藍橋杯 ADV 151 金陵十三釵 (試題解析)
提交此題 評測記錄 資源限制 時間限制 1.0s 記憶體限制 256.0mb 金陵十三釵 本題難度 難 本題占分比例 5 問題描述 在電影 金陵十三釵 中有十二個秦淮河的女人要自我犧牲代替十二個女學生去赴日本人的死亡宴會。為了不讓日本人發現,自然需要一番喬裝打扮。但由於天生材質的原因,每個人和每個人...
藍橋 金陵十三釵 狀壓 記憶化搜尋
題目描述 在電影 金陵十三釵 中有十二個秦淮河的女人要自我犧牲代替十二個女學生去赴日本人的死亡宴會。為了不讓日本人發現,自然需要一番喬裝打扮。但由於天生材質的原因,每個人和每個人之間的相似度是不同的。由於我們這是程式設計題,因此情況就變成了金陵n釵。給出n個女人和n個學生的相似度矩陣,求她們之間的匹...