計算 LIS 的長度
找出一個 LIS
- int s[5]; // 用來存 sequence
- int array[5]; // 第 x 格的值為 sequence: s[0]~s[x] 的 LIS 長度
- int LIS()
- {
- // 初始化,每一個數字本身就是長度為一的 subsequence
- for (int i=0; i<5; i++) array[i] = 1;
- // LIS
- for (int i=0; i<5; i++)
- for (int j=i+1; j<5; j++) // 找出能接在 s[i] 後面的數字
- if (s[j] > s[i]) // 若是可以接,長度就增加
- array[j] = max(array[j], array[i] + 1);
- // array 中最大的值即為 LIS 的長度
- int ans = 0;
- for (int i=0; i<5; i++)
- ans = max(ans, array[i]);
- return ans;
- }
找出一個 LIS
- int s[5];
- int array[5];
- int prev[5]; // prev[x] 紀錄 s[x] 是接在哪個位置的數字後面
- // 如果它前面沒有數字就紀錄 -1
- int LIS()
- {
- for (int i=0; i<5; i++) array[i] = 1;
- // -1 代表這個數字沒有接在其他數字之後
- for (int i=0; i<5; i++) prev[i] = -1;
- for (int i=0; i<5; i++)
- for (int j=i+1; j<5; j++)
- if (s[j] > s[i])
- if (array[i] + 1 > array[j])
- {
- array[j] = array[i] + 1;
- prev[j] = i; // s[j] 接在 s[i] 後面
- }
- int ans = 0, pos = 0;
- for (int i=0; i<5; i++)
- if (ans > array[i])
- {
- ans = array[i];
- pos = i;
- }
- print_LIS(pos); // 印出一個LIS
- return ans;
- }
- // 遞迴版
- void print_LIS(int x)
- {
- if (prev[x] != -1) print_LIS(prev[x]);
- cout << seq[x] << " ";
- }
- // 迴圈版,但是順序是顛倒的。
- void print_LIS(int x)
- {
- for (; prev[x] != -1; x = prev[x])
- cout << seq[x] << " ";
- }
留言
張貼留言