POJ 2533 最長上公升子串行

2021-08-18 07:09:06 字數 1102 閱讀 1839

思路:建立乙個dp[i]陣列,i表示乙個子串行中最後的乙個元素(也是最大的乙個元素)。然後迴圈兩次,時間複雜度o(n^2),詳見下面ac**

例題:poj 2533

**:#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

int dp[1111];

int a[1111];

int main()

{ int n ;

while(cin >> n)

{ for(int i = 0;i < n;i++)

cin >>a[i];

for(int i = 0;i < n;i++)

dp[i] = 1;//每個以自己為結尾的序列最少有乙個長度上公升序列

for (int i = 0; i < n; i++)//第一層迴圈,求以第i個元素為最後的最大上公升序列

for (int j = i+1; j < n; j++)//第二層迴圈,在後面重新整理序列

if(a[i] < a[j])//舉個例子理解下,如果陣列為1 4 3 5 ,a[i] = 3,此時以i結尾的最大子串行為1 3,a[j] = 5,由於3 < 5,所以a[j] = a[i]+1,所以a[j] 的最大子串行為1 3 5

dp[j] = max(dp[j],dp[i]+1);

int ans = 0;

for(int i = 0;i < n;i++)

ans = max(ans,dp[i]);//求以a[i]結尾的各各最大子串行中最大的那個

cout << ans <

注意:這個跟最大公共子串行容易混,我一開始是直接輸出dp陣列中最後乙個元素,後來發現錯了,舉個例子吧

陣列 1 3 4 5 2

最大的便是dp[3],也就是序列 1 3 4 5

而dp[4] 則是序列 1 2

在求最大上公升序列中,dp[i]代表的是以該位置的元素為最大值的上公升序列

而在求最大公共序列中,dp的最後乙個元素則代表從前往後的最大的乙個公共序列大小

POJ 2533 最長上公升子串行

題意很簡單,給定一串無序 數列,找其中 嚴格上公升子串行的 長度 開始接觸時 用的dp,but 耗時多,後來又學了一下方法 很簡單 怎麼理解呢?看下面 假裝數列開始就是上公升子串行,放入新數列中 題解中的a 在這之後的每乙個數,滿足上公升條件,放在後面,長度加一 不滿足條件,替換佇列中第乙個大於他的...

poj2533 最長上公升子串

題目大意 給你乙個字串,你要從裡邊找到最長的子串的長度,且這個子串必須是公升序。解題思路 dp 狀態變數 d i 以i結尾的最長上公升子串的長度 狀態轉移方程 d i max d i d j 1 j邊界 全初始化為1,因為每乙個單獨的字元都是乙個子串 include include include ...

POJ2533 動態規劃 最長上公升子串行

嘛,兩種方法,n 2和nlogn。題目概述 lis,臥槽真的不是我不想描述,而是找不到方法描述呀。總之就是最長!上公升!子串行!演算法思想 提供兩種dp方法。第一種,dp狀態記為dp i 表示以a i 結尾的序列的最大長度。這樣推得的狀態方程就是dp i max dp i dp j 1 when a...