Ответ 1
Хотя я понимаю, что вы не хотите, чтобы сухой пробег просто подсчитывал звонки, я бы все же сделал это сначала, просто чтобы посмотреть, что происходит. Итак, вот так:
def min_cost(s, d):
global count
count += 1
if s==d or s == d-1:
return cost[s][d]
mc = cost[s][d]
for i in range(s+1, d):
tmp = min_cost(s, i) + min_cost(i, d)
if tmp < mc:
mc = tmp
return mc
for n in range (2, 8):
cost = [[0 for i in range (n)] for j in range (n)]
count = 0
min_cost(0, n-1)
print (str (n) + ': ' + str (count))
Выход:
2: 1
3: 3
4: 9
5: 27
6: 81
7: 243
Итак, мы видим, что число вызовов для ds = k равно 3 степени (k-1). Знание того, что мы должны доказать, иногда значительно упрощает поиск доказательства.
Теперь, к самому доказательству. Это будет доказательство по индукции. Во-первых, обратите внимание, что количество вызовов min_cost(s, d)
зависит только от значения ds
, а не от индивидуальных значений s
и d
.
База состоит в том, что для ds=1
мы получаем один вызов. Для ds>1
мы делаем наш один вызов, и из него следуют следующие вызовы:
min_cost(s, s+1) and min_cost(s+1, d)
min_cost(s, s+2) and min_cost(s+2, d)
...
min_cost(s, d-1) and min_cost(d-1, d)
Таким образом, для ds=k
число вызовов f(k)
равно:
f(k) = 1 +
f(1) + f(k-1) +
f(2) + f(k-2) +
... +
f(k-1) + f(1)
= 2 * (f(1) + f(2) + ... + f(k-1))
Если по индуктивному предположению мы уже доказали, что f (v) = 3 v для всех v <k, то f (k):
1 + 2 * (3 1 + 3 2 +... + 3 k-1), что тривиально 3 k завершая наше доказательство.
Наконец, обратите внимание, что, хотя представленный алгоритм является экспоненциальным, основная проблема может быть решена в полиномиальное время, наиболее просто в O ((ds) ^ 2), мнимая вызовы, для которых мы уже выполнили всю работу.