一:
很容易想到的 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 為,那麼最長遞增子串行為。以...