關於子串行的問題做個記錄
一、最長上公升子串行
題目描述剝離,不管時搬箱子還是其他,一般來說,只要符合求後面的值比前面的大的序列長度基本上能套用
lis解法(1)動態規劃
找到序列1 7 3 5 9 4 8最長上公升子串行
找到初始化條件&狀態轉移方程
初始化:對於序列中的每個元素來說,它本身的長度都是1,這是個重要的初始化條件
狀態轉移方程:對於i和j來說,假設索引i>j,序列為a的話。那麼無非有兩種情況,如果a[i] > a[j],那麼序列的長度dp[j]+1 和dp[i]的值誰大的問題。即 maxlen = max(dp[i],dp[j]+1) ( a[i] > a[j]),注意此時只有a[i] 大於a[j]時才成立,也就是說當索引為i時,比較前 j個元素上公升子串行+1 和 以i結尾時最長上公升子串行誰大的問題
**如下:
int boxmaxnum(vector&numinfo)
//狀態轉移方程實現
for (int i = 0; i < allboxnum; i++)
}maxnum = max(maxnum, dp[i]);
}for (int k = 0; k < allboxnum; k++)
cout << endl;
cout << "max num is:" << maxnum << endl;
delete dp;
return maxnum;
}main函式:
int boxnum;
cin >> boxnum;
if (boxnum <= 0)
vectorboxinfo;
int numinfo;
for (int i = 0; i < boxnum; i++)
int maxnum = boxmaxnum(boxinfo);
cout << maxnum << endl;
輸出子串行和最大的上公升子串行長度
二、最大上公升子串行的和
求最大上公升子串行的和的問題 和 求最大上公升子串行的長度 理論上時一致的 上面用dp來表示最大的長度,同樣,也可以用dp來表示上公升子串行的和,問題可以向下面轉化
初始狀態: sum[i] = a[i],即每個值的位置的和為 其本身的值,初始值非常重要
狀態轉移方程:當遍歷到 i 位置時,需要不斷比較 sum[i] 和 sum[j]+a[i]的大小,與上一題的思路完全一致,唯一變化的是初始值變成每個值自身。乙個求的是最長的長度,乙個是求累加的和,都用乙個額外的資料結構來儲存 中間的長度或者和 ,最後做下比較 。相當於說 定義的資料結構sumvalue中儲存的是 從前到後的之前計算的值
1 7 3 5 9 4 8---當遍歷到5的時候,需要從1開始比較
j = 0:比較值sum[i] 和 sum[ j ] + numinfo[i] -------max(5,6)------->6
j = 1:不用比較
j = 2: 比較 sum[ i ] 和sum[ j ] + numinfo[ i ]--------------max(6, 4 (sum[2]) + 5 (numinfo[3]))-----9
依次類推
轉移方程: max ( sum[ i ], sum[ j ] + numinfo[ i ] )
當前的和的值 前乙個和的值+當前值
**:int sumvalue[1001];
int getmaxupsum(vector&numinfo)
for (int i = 1; i < len; i++) }}
for (int n = 0; n < len; n++)
return maxsumvalue;
}附上另外乙個好的解釋:
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 等等。這些子串中最長...
刷題之路 最長上公升子串行
這是乙個經典的lis 即最長上公升子串行 問題,請設計乙個盡量優的解法求出序列的最長上公升子串行的長度。給定乙個序列a及它的長度n 長度小於等於500 請返回lis的長度。例如1,2,3,2,4,5,3,6,7,5,8,lis就為12345678,長度為8 經典動態規劃問題,確定初始狀態,當以第乙個...
最長上公升子串行
問題描述 乙個數的序列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 等等...