給定有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 推薦題解 ...