問題描述
乙個數的序列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, 4, 8)等等。這些子串行中最長的長度是4,比如子串行(1, 3, 5, 8).
你的任務,就是對於給定的序列,求出最長上公升子串行的長度。
—–9.27更新,以下是錯誤的思路。—–
解題思路:
對於乙個序列 a1 a2 a3 a4 a5 a6
若用maxlen[ i ] 表示從a1到 a i 的最大上公升子串行長度
maxlen[i] 取決於maxlen[i-1]
如 1 7 3 5 4 8
maxlen[1] = 1;
maxlen[2] = maxlen[1] if(a[2] > a[1]) 則 +1
maxlen[3] = maxlen[2] 不加1
… 以此類推,問題規模變小
。。。
這個思路是有問題的,原因在於,我們並不能確定最大上公升子串行的終點總是在a[i-1], 如我們輸入乙個序列 7 8 9 1 2 3 4 ,答案就是錯誤的。
/*第一次寫時的錯誤***/
#include
#define maxn 100
using
namespace
std;
int a[maxn];
int result[maxn];
void f(int n)
}}int main()
以下是正確的解題思路:
對於以a[i]為終點的最長子序列m[i],如果前面的m[k] (k < i)都是確定且正確的,那麼我們要先找到 a[1] a[2] … a[i-1] 所有中比a[i]小的元素,記為a[k],其最大子串行為m[k],m[i] = max (k = 2 3 4 … i-1)
以下是**實現
#include
#define maxn 1010
using
namespace
std;
int a[maxn];
int result;
int m[maxn]; //m[i]表示以i為終點的最長上公升子串行
int main()
int maxlength = 1;
for(int i = 1; i <=n; ++i)
}m[i] = m;
if(m[i] > maxlength)
maxlength = m[i];
}cout
<< maxlength << endl;
return
0;
}
動態規劃 最大上公升子串行
乙個數的序列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,4,8 等等。這些子串...
最大上公升子串行(動態規劃)
最大上公升子串行 動態規劃 s 給定陣列,輸出陣列的最大上公升子串行。輸入 兩行測試資料 第一行代表陣列元素個數 第二行輸入陣列中的整數 輸出 輸出最大上公升子串行的長度 輸入樣例 81 3 4 2 7 9 6 8 輸出樣例 5 一和 二思路一樣,都是從陣列的第i 1 i n 位置開始尋找最大上公升...
動態規劃 求最長下降 上公升子串行
應該算是比較經典的一道題目了。無論是按字母順序或者按數字順序,解題的思路都應該是一樣的。用動態規劃,劃分為子問題,就是每個元素當前位置之前的最長子序列加上它自身這個值,就是當前的最長子序列長度。總結一下,演算法核心思想就是要找到當前位置元素之前的每個元素對應的最長下降 上公升子串行的最大值,然後將它...