На acmp.ru недавно выкинули 100 новых задач, и вот я нарвался на такую задачу http://acmp.ru/index.asp?main=task&id_task=553 На первый взгляд она была простая динамическое программирование на таблицах, но когда я её написал то у меня не прошёл 5 тест, хотя все мои тесты он проходит правильно.
Вот моя основная программа
read(n);
for i:=1 to n do
read(b[i],c[i]);
for i:=n-1 downto 1 do
for j:=i+1 to n do
a[i,j]:=min(a[i+1,j],a[i,j-1])+b[i]*c[j];
write(a[1,n]);
Помогите найти ошибку
Вы в своей динамике не рассматриваете такого варианта для сбора - сначала собрать 1 и 2, потом 3 и 4, потом объединить полученные два куска.
read(n);
for i:=1 to n do
read(b[i],c[i]);
for i:=1 to n-1 do
for j:=1 to n-i+1 do
a[j,i+j]:=min(a[j,i+j-1],a[j+1,i+j])+b[j]*c[j+i];
write(a[1,n]);
Который берёт этот тест, но и он не проходит 5 тест
1. for j:=1 to n-i+1 do, правый предел кажется не такой.
2. Рассмотрите как получается ответ a[1,4]. У вас он получается из a[1,3] или из a[2,4], а должен ещё рассматриваться случай a[1,2]+a[3,4].
Нужно понять что к состоянию a[i,j] можно прийти не двумя способами как у вас, а j-i способами.