在過三個禮拜,yellowstar有一場專業英語考試,因此它必須著手開始複習。
這天,yellowstar準備了n個需要背的單詞,每個單詞的長度均為m。
yellowstar準備採用聯想記憶法來背誦這n個單詞:
1、如果yellowstar憑空背下乙個新詞t,需要消耗單詞長度m的精力
2、如果yellowsatr之前已經背誦了一些單詞,它可以選擇其中乙個單詞si,然後通過聯想記憶的方法去背誦新詞t,需要消耗的精力為hamming(si, t) * w。
hamming(si, t)指的是字串si與t的漢明距離,它表示兩個等長字串之間的漢明距離是兩個字串對應位置的不同字元的個數。
由於yellowstar還有大量繁重的行政工作,因此它想消耗最少的精力背誦下這n個單詞,請問它最少需要消耗多少精力。
input
包含多組測試資料。
第一行為n, m, w。
接下來n個字串,每個字串長度為m,每個單詞均為小寫字母'a'-'z'組成。
1≤n≤1000
1≤m, w≤10
output
輸出乙個值表示答案。
sample input
3 4 2sample outputabch
abcd
efgh
10hint
最優方案是:先憑空記下abcd和efgh消耗精力8,在通過abcd聯想記憶去背誦abch,漢明距離為1,消耗為1 * w = 2,總消耗為10。
最小生成樹。
我們先處理聯想記憶法,我們把a向b連一條權值為聯想記憶法代價的雙向邊。
然後處理直接記憶,我們新開乙個節點,把它向每個節點連一條權值為m的邊。
然後跑prim即可。
雙向邊要開2倍空間。prim要加乙個陣列表示當前節點在不在最小生成樹內(比dij多開乙個陣列)
#include#include#include
#include
using
namespace
std;
int h[1010],to[2101000],nxt[2101000],cost[2101000],k=0
;char c[1010][11];int d[1010];bool used[1010
];typedef pair
p;priority_queue
,greater>q;
void ins(int u,int v,int c)
int prim(int
s) }
}return
ans;
}int
main()
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int i=1;i<=n;i++)ins(n+1,i,m),ins(i,n+1
,m);
printf(
"%d\n
",prim(n+1
)); }
}
FZU 2254 英語考試
在過三個禮拜,yellowstar有一場專業英語考試,因此它必須著手開始複習。這天,yellowstar準備了n個需要背的單詞,每個單詞的長度均為m。yellowsatr準備採用聯想記憶法來背誦這n個單詞 1 如果yellowstar憑空背下乙個新詞t,需要消耗單詞長度m的精力 2 如果yellow...
FZU2254 英語考試
在過三個禮拜,yellowstar有一場專業英語考試,因此它必須著手開始複習。這天,yellowstar準備了n個需要背的單詞,每個單詞的長度均為m。yellowsatr準備採用聯想記憶法來背誦這n個單詞 1 如果yellowstar憑空背下乙個新詞t,需要消耗單詞長度m的精力 2 如果yellow...
FZU2254 英語考試 最小生成樹
problem 2254 英語考試 在過三個禮拜,yellowstar有一場專業英語考試,因此它必須著手開始複習。這天,yellowstar準備了n個需要背的單詞,每個單詞的長度均為m。yellowsatr準備採用聯想記憶法來背誦這n個單詞 1 如果yellowstar憑空背下乙個新詞t,需要消耗單...