Я нашел алгоритм, упомянутый в Автостопом по соревнованиям по программированию (примечание: эта реализация предполагает наличие в списке нет дубликатов):
set<int> st;
set<int>::iterator it;
st.clear();
for(i=0; i<n; i++) {
st.insert(array[i]); it=st.find(array[i]);
it++; if(it!=st.end()) st.erase(it);
}
cout<<st.size()<<endl;
Это алгоритм поиска самой длинной возрастающей подпоследовательности за O(NlogN). Если я попытаюсь работать с несколькими тестовыми примерами, это, кажется, сработает. Но я все еще не мог понять логику его правильности. Кроме того, мне это не кажется таким уж интуитивным.
Может ли кто-нибудь помочь мне понять, почему этот алгоритм работает правильно?
Dynamic programming
,memoization
, а также об этом ocw.mit.edu/courses/electrical-engineering-and-computer-science/ - person noMAD   schedule 15.12.2013