problem 2254 英語考試
在過三個禮拜,yellowstar有一場專業英語考試,因此它必須著手開始複習。
這天,yellowstar準備了n個需要背的單詞,每個單詞的長度均為m。
yellowsatr準備採用聯想記憶法來背誦這n個單詞:
1、如果yellowstar憑空背下乙個新詞t,需要消耗單詞長度m的精力
2、如果yellowsatr之前已經背誦了一些單詞,它可以選擇其中乙個單詞si,然後通過聯想記憶的方法去背誦新詞t,需要消耗的精力為hamming(si, t) * w。
hamming(si, t)指的是字串si與t的漢明距離,它表示兩個等長字串之間的漢明距離是兩個字串對應位置的不同字元的個數。
由於yellowstar還有大量繁重的行政工作,因此它想消耗最少的精力背誦下這n個單詞,請問它最少需要消耗多少精力。
包含多組測試資料。
第一行為n, m, w。
接下來n個字串,每個字串長度為m,每個單詞均為小寫字母'a'-'z'組成。
1≤n≤1000
1≤m, w≤10
輸出乙個值表示答案。
3 4 2
abch
abcd
efgh 10
最優方案是:先憑空記下abcd和efgh消耗精力8,在通過abcd聯想記憶去背誦abch,漢明距離為1,消耗為1 * w = 2,總消耗為10。
福州大學第十四屆程式設計競賽_重現賽
題解「:
剛開始以為要進行動態規劃,搞了半天也沒搞出來,看了一下大神的題解,臥槽,這麼神奇,最小生成樹。
觀察資料範圍,我們能夠暴力處理出dist【i】【j】,表示通過單詞i來學會單詞j的花費。
很顯然,dist【i】【j】=min(m,hanming(i,j)*w);
我們的目標是學會所有的單詞,其實就是相當於讓所有單詞通過這些邊連在一起,合併成乙個聯通塊。
那麼很顯然,我們用n-1條邊是最優方案。
那麼這裡就是在讓你求一顆最小生成樹。
我們o(n^2m)暴力處理出dist【i】【j】之後,再跑一遍prim即可。因為邊數比較多,kruskal演算法需要o(n^2logn^2)的時間複雜度,不如o(n^2)優。
那麼總花費就是最小生成樹需要的總權值+m(一開始要直接背會乙個單詞)
#includeusing namespace std;
#define inf 0xffffff
#define n 1005
int map[n][n],dis[n],pre[n];
//map存兩點距離,dis存未收入點到收入點距離,pre存該點的父結點
char c[n][15];
int i,j,n,m,w;
int prim()
dis[1]=0;
pre[1]=0;
int sum=0,flag,minn;
for(i=2;i<=n;i++)
} return sum;
}
int main(){
while(~scanf("%d%d%d",&n,&m,&w)){
for(int i=1;i<=n;i++)scanf("%s",c[i]);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int cnt=0;
for(int k=0;k
FZU 2254 英語考試 (最小生成樹)
problem 2254 英語考試 在過三個禮拜,yellowstar有一場專業英語考試,因此它必須著手開始複習。這天,yellowstar準備了n個需要背的單詞,每個單詞的長度均為m。yellowsatr準備採用聯想記憶法來背誦這n個單詞 1 如果yellowstar憑空背下乙個新詞t,需要消耗單...
FZU 2254 英語考試 最小生成樹)
problem 2254 英語考試 在過三個禮拜,yellowstar有一場專業英語考試,因此它必須著手開始複習。這天,yellowstar準備了n個需要背的單詞,每個單詞的長度均為m。yellowsatr準備採用聯想記憶法來背誦這n個單詞 1 如果yellowstar憑空背下乙個新詞t,需要消耗單...
FZU 2254 英語考試
在過三個禮拜,yellowstar有一場專業英語考試,因此它必須著手開始複習。這天,yellowstar準備了n個需要背的單詞,每個單詞的長度均為m。yellowsatr準備採用聯想記憶法來背誦這n個單詞 1 如果yellowstar憑空背下乙個新詞t,需要消耗單詞長度m的精力 2 如果yellow...