Есть задача. Коротенько о том, что надо сделать: на вход даётся строчка A и строчка B. Пример для А: «143175», для В: «120». Нужно между символами в строчке А вставить минимальное количество знаков «+» чтобы получить В. В данном случае: 14 + 31 + 75 = 120. На выходе программа должна возвращать минимальное количество плюсов. Количество символов в А не больше 1000, значение В не больше 5000. Время работы программы должно быть меньше 1 секунды.
Пример 2: А=«5025», В=«30». 5 + 25 = 30. Минимальное количество плюсов: 1.
Пример 3: А=«999899», В=«125». 9 + 9 + 9 + 89 + 9 = 125. Минимальное количество плюсов: 4.
Я написал такую программу:
checkPluses :: Int -> Int -> Int -> String -> String -> Bool
checkPluses result pVal 0 "" xs = pVal + (read xs :: Int) == result
checkPluses result pVal plusCount "" xs =
checkPluses result pVal plusCount [head xs] (tail xs)
checkPluses result pVal plusCount xs xs'
| pVal > result = False
| (length xs' < plusCount) = False
| (checkPluses result (pVal + (read xs :: Int)) (plusCount - 1) "" xs') ==
False = checkPluses result pVal plusCount (xs ++ [head xs']) (tail xs')
| otherwise = True
checkPlus :: String -> String -> Int -> Bool
checkPlus xs res pluses =
checkPluses (read res :: Int) 0 pluses "" xs
searchPlusesIter :: Int -> String -> String -> Int
searchPlusesIter pluses xs res
| checkPlus xs res pluses == True = pluses
| otherwise = searchPlusesIter (pluses + 1) xs res
searchPluses :: String -> String -> Int
searchPluses = searchPlusesIter 0
λ> searchPluses "143175" "120"
2
Прошу идей по алгоритму.