計算 LIS 的長度
-
int s [5]; // 用來存 序列
-
int array [5]; // 第 x 格的值為 序列: s [0]~s [x] 的 LIS 長度
-
int LIS()
-
{
-
// 初始化,每一個數字本身就是長度為一的 子序列
-
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] << " ";
-
}