題目描述:
給定乙個長度為n的數列,求數值嚴格單調遞增的子串行的長度最長是多少。
輸入格式
第一行包含整數n。第二行包含n個整數,表示完整序列。
輸出格式
輸出乙個整數,表示最大長度。
資料範圍
1≤n≤1000,−10^9≤數列中的數≤10^9
輸入樣例:
7
3 1 2 1 8 5 6
輸出樣例:
4
分析:
設用陣列a[n]儲存該數列,很容易想到用f[i]表示前i + 1個數中的最長上公升子串行的長度,但是如何由規模為n - 1的問題的解求出規模為n的問題呢?比如2 1 5 3中,最長上公升子串行為1 3,1 5和2 5,長度為2,如果在序列後面再追加乙個4,我們知道,每個上公升子串行都有乙個末尾元素,只有4大於該末尾元素才能夠使得該上公升子串行長度加1,所以以4為末尾的上公升子串行有2 4,1 4,3 4,1 3 4,然後最長的長度是3,於是2 1 5 3 4的最長上公升子串行長度是3。在求解過程中,我們只需要知道兩個資訊,乙個是4可以加到哪些序列後面,另乙個是加在哪個序列後面使得以4為末尾的子串行長度最長。比如4加在3後面,3之前的是什麼元素對4而言並不重要,我們只需要知道以3為末尾的最長上公升子串行長度是多少即可,因此,我們每在乙個序列後加乙個元素,需要知道之前的序列以每個元素為結尾的最長上公升子串行長度是多少,設b[i]表示以a[i]為結尾的最長上公升子串行長度,則只要新加入的元素》a[i],就可以擴充套件該上公升子串行的長度。然後max(b[i])即是數列中最長上公升子串行的長度。
本題給我們的啟示是,如果f陣列的含義直接按最優解設遞推不方便,不妨換種設法,找到了以i為末尾的最長上公升子串行長度,遍歷一遍,就得到了題目的最優解。
#include #include using namespace std;
const int maxn = 1005;
int a[maxn],b[maxn];
int main()
b[i] = t + 1;
}for(int i = 0;i < n;i++) res = max(res,b[i]);
cout
}
acwing 895 最長上公升子串行
給定乙個長度為n的數列,求數值嚴格單調遞增的子串行的長度最長是多少。第一行包含整數n。第二行包含n個整數,表示完整序列。輸出乙個整數,表示最大長度。1 n 1000,109 數列中的數 109 7 3 1 2 1 8 5 64這個可以動態規劃,也可以其他,動態規劃複雜度為o n n 貪心 二分則可以...
Dp 最長上公升子串 最長上公升子串行
乙個數的子串bi,當b1 b2 bs的時候,我們稱這個子串是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串 ai1,ai2,aik 這裡1 i1 i2 ik n。如 對於序列 1,7,3,5,9,4,8 有它的一些上公升子串,如 1,7 3,5,9 等等。這些子串中最長...
ACWing 896 最長上公升子串行 II
給定乙個長n nn數列a aa,求嚴格單調遞增的子串行的最長長度。輸入格式 第一行包含整數n nn。第二行包含n nn個整數,表示完整序列。輸出格式 輸出乙個整數,表示最大長度。資料範圍 1 n 100000 1 le n le 100000 1 n 10 0000 10 9 x 10 9 10 9...