internal IDictionary<int, Pair<int>> Calc(string sentence, IDictionary<int, List<int>> dag)
{
var n = sentence.Length;
var route = new Dictionary<int, Pair<int>>();
route[n] = new Pair<int>(0, 0.0);
var logtotal = Math.Log(WordDict.Total);
for (var i = n - 1; i > -1; i--)
{
var candidate = new Pair<int>(-1, double.MinValue);
foreach (int x in dag[i])
{
var freq = Math.Log(WordDict.GetFreqOrDefault(sentence.Sub(i, x + 1))) - logtotal + route[x + 1].Freq;
if (candidate.Freq < freq)
{
candidate.Freq = freq;
candidate.Key = x;
}
}
route[i] = candidate;
}
return route;
}