動態規劃例題2 刪除最少的子元素

2021-08-29 22:40:40 字數 912 閱讀 2162

給定有n個數的a序列:a1,a2,a3,....an,對於這個數列,我們想得到乙個子串行ap1,ap2...api....apm

滿足ap1 >= ap2>=api <=....<=apm

從a中刪除多少元素,可以得到我們所需的子串行

輸入

7

3 2 4 1 2 5 3

輸出

2
解題思路,我們可以通過動態規劃演算法,從左到右得到各個子串行的上公升子串行元素個數(用dp儲存狀態)

從右到左得到各個子串行的下降子串行個數(也用乙個dp儲存狀態)

最後將每個狀態相加,排序得到最大的那個狀態

實現**如下:

#include #include using namespace std;

int countdeletedelements(vector&nums) ;

int dp2[1001] = ;

//從左到右遞減子串行

for (int i = 0; i < nums.size(); ++i)

} }//從右到左遞增

for (int i = nums.size() - 1; i >= 0; --i)

} }//單個點進行比較列舉

int temp = 0;

for (int i = 0; i < nums.size(); ++i) }

return nums.size() - temp + 1;

}int main()

cout << countdeletedelements(a) << endl;

return 0;

}

動態規劃的簡單例題(2)

d點有乙個過河卒,需要走到目標b點。卒行走規則 可以向下 或者向右。同時在棋盤上的任一點有乙個對方的馬 如下圖的c點 該馬所在的點和所有跳躍一步可達的點稱為對方馬 的控制點,例如下圖的c點上的馬可以控制9個點 圖中的p1,p2,p8和c 卒不能通過對方馬的控制點。棋盤用座標表示,a點 0,0 b點 ...

最長非上公升子串行 刪除最少的元素

其實就是最長上公升子串行的一種變相,要求最長非上公升子串行,其實就是把大小順序換一下,替換是去替換子串行中那個第乙個比你小的數。分兩次,從頭和從尾開始,dp i 表示到達i的子串行長度。加起來 1就是兩個序列到i的長度和。include includeusing namespace std int ...

動態規劃幾類例題的筆記

蒟蒻亂寫一通關於動態規劃幾類問題的筆記,可能會有錯誤之處,歡迎指正。一.01揹包問題 關於這個問題,我之前已經寫了不太全面的 比較扯淡的 筆記,就不複述了。傳送門 揹包問題學習筆記 補充一下除了01揹包 完全揹包 多重揹包外,還有乙個超大揹包問題值得了解。二.最長上公升子串行問題 lis 推薦題解 ...