Проблема здесь в том, что, хотя вы действительно обрабатываете каждое ребро, вы обрабатываете их в порядке, который не гарантирует, что вы действительно обнаружите нужные пути. Например, рассмотрим этот DAG:
1 -> 2 -> 3
Представьте, что входной файл имеет ребра в следующем порядке:
2 3
1 2
Первоначально dp [1], dp [2] и dp [3] все ноль. После просмотра первой строки dp [2] устанавливается на 1, а после второй dp [1] также устанавливается на 1. Однако эти окончательные значения неверны, потому что dp [2] должно быть 2.
Причина, по которой это не удается, заключается в том, что рассматриваемое вами решение DP работает, только если вы посещаете ребра в топологическом порядке, в котором каждый раз, когда вы видите ребро от x до y, вы знаете, что уже вычислили длину самого длинного пути до x, прежде чем подумать об обновлении y.
Чтобы это исправить, сохраните ребра, которые вы прочитали, и посетите ребра в топологическом порядке узлов. Вы можете найти топологические заказы разными способами, и я оставлю вам детали. : -)
Надеюсь, это поможет!