參考:
每一次從頭掃瞄找出最佳答案。
int a[maxn]
, d[maxn]
;intdp(
)}return ans;
}
參考了這篇文章
那麼**如下:
for
(int i =
0; i < n;
++i)
scanf
("%d"
, a + i)
;memset
(dp,
0x1f
,sizeof dp)
;mx = dp[0]
;for
(int i =
0; i < n;
++i)
ans =0;
while
(dp[ans]
!= mx)
++ans;
例題:
某國為了防禦敵國的飛彈襲擊,研發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試驗階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。
輸入資料只有一行,該行包含若干個資料,之間用半形逗號隔開,表示飛彈依次飛來的高度(飛彈最多有 20 枚,其高度為不大於 30000 的正整數)。
輸出資料只有一行,該行包含兩個資料,之間用半形逗號隔開。第乙個資料表示這套系統最多能攔截的飛彈數;第二個資料表示若要攔截所有飛彈至少要再新增多少套這樣的系統。
389
,207
,155
,300
,299
,170
,158
,65
6
,1
每個測試點限時 1 秒。
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
1e5+2;
int dp[maxn]
;// dp[k]表示長度為k的不下降子串行末尾元素的最小值
// int minh[maxn]; //記錄從第i項開始,剩下最大能消滅的飛彈數量
vector<
int> v;
intup_bound
(int l,
int r,
int x)
return l;
}int
down_bound
(int l,
int r,
int x)
intmain()
v.push_back(0
);reverse
(v.begin()
, v.
end())
;int len =1;
dp[1]
= v[1]
;for
(int i =
2; i < v.
size()
; i++
)else
} cout << len <<
",";
//第二問就出最大下降子串行
len =1;
dp[1]
= v[1]
;for
(int i =
2; i < v.
size()
; i++)}
cout << len -
1<< endl;
return0;
}/*90 103 99 83 102 70 86 70 99 71*/
最長不下降子串行 動態規劃
一。問題描述 給定乙個序列a1 a2 a3 an現要求你從中找到最長的不下降子串行 二。問題分析 該問題可以和之前的max sum問題模擬,如果從決策的角度入手,直接引入並定義狀態f i 為 a i 所在子串行到i的長度 那我們的決策策略應該就是使得 f i 最大 所以基於這個分析我們很容易列出動態...
動態規劃 最長不下降子串行LIS
找出一組資料中最長的不下降子串行的長度。1,連續情況。即必須要求子數列連續相依 1 2 3 1 2 7 9中的最長子串行為3 1,2,3 易得遞推公式 if f i f i 1 dp i dp i 1 1 else dp i 1 includeusing namespace std define m...
動態規劃 最長不下降子串行 簡潔
問題描述 求乙個數列的最長不下降子串行.設有由n個不相同的整數組成的數列,記為 a 1 a 2 a n 且a i a j i j 若存在i1a n 1 則存在長度為1的序列a n 1 或a n 2 之後的過程類似,當前滿足條件找出後面序列長度的最大值進行加一.include includeusing...