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

2021-06-28 06:17:34 字數 1051 閱讀 6600

嘛,兩種方法,n^2和nlogn。

題目概述:

lis,臥槽真的不是我不想描述,而是找不到方法描述呀。總之就是最長!上公升!子串行!

演算法思想:

提供兩種dp方法。

第一種,dp狀態記為dp[i]表示以a[i]結尾的序列的最大長度。這樣推得的狀態方程就是dp[i] = max(dp[i],dp[j]+1) when a[j]第二種,dp狀態記為dp[i]表示長度為i的最長上公升子串行的結尾數字。

這種方法就要多說幾句了,起因是如果子串行的長度相同,那麼結尾數字較小的會在之後有更大的優勢,所以最開始dp[i]的值全部化為inf。然後在迴圈中,借用lower_bound這個stl函式,來實現二分搜尋。

**部分:

第一種方法:

#include #include using namespace std;

int dp[1005];

int a[1005];

int main()

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

} res = max(res, dp[i]);

} cout << res << endl;

return 0;

}

第二種方法:

#include #include using namespace std;

int a[1005]; int dp[1005];

const int inf = 100000000;

int main()

fill(dp, dp + n, inf);

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

cout << lower_bound(dp, dp + n, inf) - dp << endl;

return 0;

}

poj2533 最長上公升子串

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

POJ 2533 最長上公升子串行

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

POJ 2533 最長上公升子串行

思路 建立乙個dp i 陣列,i表示乙個子串行中最後的乙個元素 也是最大的乙個元素 然後迴圈兩次,時間複雜度o n 2 詳見下面ac 例題 poj 2533 include include include include include include include include include...