因為一共只有10種可能的數字[0-9],所以等式中包含的所有的字元最多包含10種,我們只需要列舉每一種字元對應到每一種數字,得到滿足條件的那乙個即可,但是要注意,首字元不能為0。
思路非常的簡單,但是也要注意,處理不當可能會超時。我們如果直接列舉每一種字元可能對應的數字,然後再根據等式計算結果,這樣非常可能超時。可以先進行預處理,求出給定的所有串**現的字元的出現的次數和出現的位置代表的數字的和,最終將這些和加上就能判斷正確結果。最後這一點不好描述,但是**非常清晰,可以檢視**
// 每一種字元出現的權重
int[
] weights =
newint[26
];// 哪些字元不能為0
boolean
notzero =
newboolean[26
];public
boolean
issolvable
(string[
] words, string result)
notzero[words[i]
.charat(0
)-'a']
=true;}
int p =1;
for(
int i = result.
length()
-1; i >=
0; i--
) notzero[result.
charat(0
)-'a']
=true
; list
list =
newarraylist
<
>()
;// 獲取到所有出現的字元
for(
int i =
0; i <
26; i++)}
integer[
] ints = list.
toarray
(new
integer[0
]);return
dfs(ints,
newboolean[10
],0,
0);}
public
boolean
dfs(integer[
] chars,
boolean
vis,
int index,
int sum)
for(
int i =
0; i <
10; i++
) vis[i]
=true;if
(dfs
(chars, vis, index +
1, sum + i * weights[chars[index]])
) vis[i]
=false;}
}return
false
;}
HD 6287 口算訓練
problem description 小q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小t,給了小t乙個長度為 n 的正整數序列 a 1,a2 an,要求小t丟擲 m 個問題以訓練他的口算能力。每個問題給出三個正整數 l r,d 小q需要通過口算快速判斷 a l al 1 a r 1 ar是...
HDU 6287 口算訓練
小q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小t,給了小t乙個長度為n的正整數序列a1,a2,an,要求小t丟擲m個問題以訓練他的口算能力。每個問題給出三個正整數l,r,d,小q需要通過口算快速判斷al al 1 ar 1 ar是不是d的倍數。小q迅速地回答了出來,但是小t並不知道正確答案...
HDU 6287 口算訓練
小q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小t,給了小t乙個長度為n的正整數序列a1,a2,an,要求小t丟擲m個問題以訓練他的口算能力。每個問題給出三個正整數l,r,d小q需要通過口算快速判斷al al 1 ar 1 a r al al 1 ar 1 ar 是不是d的倍數。小q迅速地回...