diff --git a/include/cppjieba/MPSegment.hpp b/include/cppjieba/MPSegment.hpp index 53943aa4..a4d5b622 100644 --- a/include/cppjieba/MPSegment.hpp +++ b/include/cppjieba/MPSegment.hpp @@ -40,6 +40,7 @@ class MPSegment: public SegmentTagged { return dictTrie_->IsUserDictSingleChineseWord(value); } private: +/* void CalcDP(vector& dags) const { for (auto rit = dags.rbegin(); rit != dags.rend(); rit++) { rit->max_next = -1; @@ -64,6 +65,33 @@ class MPSegment: public SegmentTagged { } } } +*/ + void CalcDP(vector& dags) const { + size_t size = dags.size(); + + for (size_t i = 0; i < size; i++) { + dags[size - i - 1].max_next = -1; + dags[size - i - 1].max_weight = MIN_DOUBLE; + + for (const auto & it : dags[size - i - 1].nexts) { + const auto nextPos = it.first; + double val = dictTrie_->GetMinWeight(); + + if (nullptr != it.second) { + val = it.second->weight; + } + + if (nextPos < dags.size()) { + val += dags[nextPos].max_weight; + } + + if ((nextPos <= dags.size()) && (val > dags[size - i - 1].max_weight)) { + dags[size - i - 1].max_weight = val; + dags[size - i - 1].max_next = nextPos; + } + } + } + } void CutByDag(RuneStrArray::const_iterator begin, RuneStrArray::const_iterator,