LIS 最長上公升子串行 (二分優化)

2021-06-22 19:27:56 字數 1316 閱讀 5687

題目:

長度為n的序列a1, a2, ..., an,選出滿足 j < i 時, a[j] < a[i] 最長子序列

分析:當選擇第i個時候,在j狀態:dp[i]表示以i為終點的最大上公升序列

轉移方程:  

dp[i] = max

}

**:

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

int v[10000+10];

int dp[10000+10];

int main()

ans = 0;

memset(dp, 0, sizeof(dp));

for(i = 1; i<=n; i++)

ans = max(ans, dp[i]);

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

}return 0;

}

二分優化:

如果子串行長度相同,則終點越小,則後面增長的潛能就越大

所以,將長度相同的位置設成其中最小值

狀態:dp[i]表示長度為i的序列中終點最小的值

轉移:因為dp[i]單調遞增,若a[j]>dp[i],則加入其後,若a[j]

優化**:

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

#define inf 0x7f7f7f7f

#define max 1000+10

int a[max];

int dp[max];

int main()

for(i = 1; i<=n; i++)

printf("%d\n", lower_bound(dp, dp+n, inf) - dp);

} return 0;

}

ps(有序二分搜尋):

1、lower_bound(first, last, value);返回乙個

指標,指向ai>= value的第乙個元素。

2、upper_bound(first, last, value);返回乙個指標,指向ai> value的第乙個元素。

LIS 最長上公升子串行 dp 二分優化

建立乙個陣列res maxn res i 用來記錄以i位置為結尾的最長的子串行,那麼我們要求res這個陣列裡的最大值 注意不是res n 所以當我們在求res i 時,需要從0到i 1掃一遍,看看通過哪個點 鬆弛 因為這個演算法好像迪科斯徹最短路,所以借用這個名詞來解釋一下 這樣 如下 includ...

LIS 最長上公升序列(DP 二分優化)

求乙個數列的最長上公升序列 動態規劃法 o n 2 1 dp 2int lis int a,intn 3 16 17 18return cnt 1 因為初始化為0,所以返回結果 1 19 貪心 二分法 o nlogn 分析 要讓乙個序列具有最長上公升子串行,其實就是保證子串行中的每個元素盡可能小,降...

最長上公升子串行 II(LIS) 二分優化

題目鏈結 思路 這題說是dp,但是分析完之後更像貪心了,首先舉個例子比如乙個序列 3 1 2 1 8 5 6。後面下標從1開始計 那麼對於 a 1 a 1 a 1 和 a 2 a 2 a 2 來說,如果上公升子串行長度為2,那麼能接在 a 1 a 1 a 1 後面的也一定能接在 a 2 a 2 a ...