日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[蓝桥杯][算法提高VIP]金陵十三钗(状压dp记忆化搜索)

發布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [蓝桥杯][算法提高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.然后利用記憶化搜索,遇見重復的情況就可以直接返回了,大大減少了時間復雜度。
代碼如下:

#include<bits/stdc++.h> #define ll long long using namespace std;const int maxx=15; const int maxm=(1<<14); int a[maxx][maxx]; int dp[maxx][maxm]; int n;inline int dfs(int x,int val) {if(dp[x][val]!=-1) return dp[x][val];int _max=0;if(x==n)//最后一行了,能用的位置肯定就只剩一個了,找到返回就ok了。{for(int i=1;i<=n;i++){int zz=(1<<(i-1));if(zz&val) return a[x][i];}}else{for(int i=1;i<=n;i++){int zz=(1<<(i-1));if(zz&val) _max=max(_max,a[x][i]+dfs(x+1,val-zz));//val-zz就代表著將那個位置由1變為0.}}return dp[x][val]=_max; } int main() {memset(dp,-1,sizeof(dp));scanf("%d",&n);for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);int val=(1<<n)-1;printf("%d\n",dfs(1,val));return 0; }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的[蓝桥杯][算法提高VIP]金陵十三钗(状压dp记忆化搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。