最長遞增子串行(LIS)

2022-05-13 16:27:08 字數 1660 閱讀 9328

一:

很容易想到的 dp的o(n^2)的複雜度

#pragma comment(linker,"/stack:102400000,102400000")

#include #include #include #include #include #include #include #include #include #include using namespace std;

#define clc(a, b) memset(a, b, sizeof(a))

const int inf = 0x3f;

const int inf = 0x3f3f3f3f;

const int maxn = 1000;

int n, a[maxn], dp[maxn];

int lis()

}k = dp[i] > k ? dp[i] : k;

}return k;

}int main()

}

二: 擴充套件公升級版, 求定長的上公升子串行個數

#pragma comment(linker,"/stack:102400000,102400000")

#include #include #include #include #include #include #include #include #include #include using namespace std;

#define clc(a, b) memset(a, b, sizeof(a))

const int inf = 0x3f;

const int inf = 0x3f3f3f3f;

const int maxn = 1000;

const int mod = 1000000007;

int n, m, a[maxn], dp[maxn][maxn], sum[maxn];

//sum 記錄長度為i的子串行個數 dp[i][j] 記錄從i開始長度為j的個數

int lis()

}sum[k] = (sum[k] + dp[i][k]) % mod;

//printf("i = %d, sum[%d] = %d\n", i, k, sum[k]);}}

return 0;

}int main()

}return 0;

}

三: dp + 二分法

#include #include #include #include #include #include #include #include #include #include using namespace std;

const int inf = 0x3f;

const int inf = 0x3f3f3f3f;

const int maxn = 1e5+5;

int lis[maxn], a[maxn], n;

int binsearch(int len, int x)

else

}return left;

}int lis()

else

}return len;

}int main()

int ans = lis();

printf("%d\n", ans);

}}

最長遞增子串行 LIS

對於這個問題,最直觀的dp方法是cnt i 表示以height i 結束的最長遞增子串行的元素的個數,遞迴方程是cnt i max for max i 0 i求出整個數列的最長遞增子串行的長度 if b i max max b i cout return 0 顯然,這種方法的時間複雜度仍為o n 2...

最長遞增子串行 LIS

給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4.這個問題可以轉換為最長公共子串行問題。如例子中的陣列a,則我們排序該陣列得到陣列a 然後找出陣列a和a 的最長公共子串行即可。顯然這裡最長公共子串行...

最長遞增子串行(LIS)

300.longest increasing subsequence good 給定乙個長度為n的陣列,找出乙個最長的單調遞增子串行 不一定連續,當時先後順序不能亂 更正式的定義是 設l 是n個不同的實數的序列,l的遞增子串行是這樣乙個子串行lin 其中k1。比如陣列a 為,那麼最長遞增子串行為。以...