執行結果:

41 67 34 0 69 24 78 58 62 64
5 45 81 27 61 91 95 42 27 36
91 4 2 53 92 82 21 16 18 95
47 26 71 38 69 12 67 99 35 94
3 11 22 33 73 64 41 11 53 68
47 44 62 57 37 59 23 41 29 78
16 35 90 42 88 6 40 42 64 48
46 5 90 29 70 50 6 1 93 48
29 23 84 54 56 40 66 76 31 8
44 39 26 23 37 38 18 82 29 41
length: 16
95 92 82 71 69 67 64 62 59 50 48 44 39 26 23 18

程式碼:

// Longest Increasing Subsequence
// 參考 PingLunLiao 來自 http://www.csie.nfu.edu.tw/phpBB3/viewtopic.php?p=64580

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    using namespace std;
    vector<int> num;
    int input;
    int i;
    // random generate number
    for (i = 0;i<100;i++)
        num.push_back(rand()%100);
    // print data
    for (vector<int>::iterator it = num.begin();
        it != num.end();it++)
    {
        if (i%10 == 0) cout << endl;
        cout << *it << " ";
        i++;
    }
    cout << endl;
    vector<int> best;
    best.resize(num.size());

    best[0] = 1;
    int maxLen = 1;

    // Dynamic Programming:
    // if( num[i] > num[k] )
    // best[i] = max(best[0] ... best[k])
    for( int i = 1; i < num.size(); i++ )
    {
        short tempBest = 0;
        //find an (number) that smaller than (num[i]) and have (sequence length) that biggest!
        for( int k = i - 1; k >= 0; k-- )
        {
            if( num[i] < num[k] )
            {
                if( tempBest < best[k] )
                {
                    tempBest = best[k];
                }
            }
        }
        best[i] = tempBest + 1;
        if( best[i] > maxLen ) maxLen = best[i];
    }
    // get Longest Increasing Subsequence's length
    int minindex = std::max_element(best.begin(), best.end()) - best.begin() ;
    int minmum = num[minindex];
    int minvalue = best[minindex];
    cout << "length: " << minvalue << endl;
   vector<int> answer;
    // inverse print answer
    for (int i = num.size()-1;i >= 0;i--)
    {
        if (best[i] == minvalue)
        {
            if (minmum <= num[i])
            {
                --minvalue;
                minmum = num[i];
                answer.push_back(num[i]);;
            }
        }
    }
    reverse(answer.begin(), answer.end());
    for (int i=0;i < answer.size();i++)
        cout << answer[i] << " ";

    return 0;
}

arrow
arrow
    全站熱搜

    讓地獄深紅的天亮 發表在 痞客邦 留言(0) 人氣()