題意, 長度為n的序列, a1,a2, ...,ai, ..., an, 求最長嚴格上公升子串行長度,與最長下降非嚴格自序列長度.
解法: 首先不得不吐嘈下題目的讀入,噁心指數上達5顆星.
對於一套攔截系統最多能攔截多少飛彈, 求個非嚴格下降子串行就可以了.就不廢話了. 主要還是求最少攔截數量.
有乙個結論, 最少攔截系統數量為 嚴格上公升子串行. 思路如下:
假定乙個最長上公升子串行形式如: ...a_i ... aj ...
對於 a_i 與 a_j 之間的數 x 只可能有兩類, x <= a_i , 則可以 將這些飛彈劃分到 a_i攔截系統, x >= aj, 則可以將這些飛彈劃分到 a_j攔截系統.
其它區間類似. 其中還有如下情況, b_1, b_2, <= a_i, 但是 b_1 > b_2, 那麼b_1,b_2必定不能歸結於乙個攔截系統, 但是必定可以被 a_i之前的系統攔截.
o(n^2) **實現,
令 g( i ), 表示前i個飛彈, 取第i個的最大長度.
dp(i), 表示前i個飛彈, 最長上公升子串行長度.
g(i) = max( 1, g(j) ) a_i > a_j
dp(i) = max( dp(i-1), g(i) )
#include#includeview code#include
#include
using
namespace
std;
const
int n = 101000
;int
g[n], dp[n], n, a[n];
intmain()
printf(
"%d\n
", dp[n] );
dp[0] = 0
;
for(int i = 1; i <= n; i++)
printf(
"%d\n
", dp[n] );
return0;
}
o(nlogn)的寫法,前面寫過的題目裡頭有, 就懶得貼了.
攔截飛彈 最長上公升子串行 LIS
某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,並觀測到飛彈依次飛來的高度,請計算這套系統最多能攔截多少飛彈。攔截來襲飛彈時,必須按來襲飛彈襲擊的時間順...
攔截飛彈(最長上公升子串行,最長不上公升子串行)
攔截飛彈 noip 1999 題目描述 張琪曼 老師,修羅場是什麼?墨老師 修羅是佛家用語,修羅畢生以戰鬥為目標,修羅場指的是他們之間的死鬥坑,人們通常用 修羅場 來形容慘烈的戰場。後來又引申出 乙個人在困境中做絕死奮鬥 的意思。所以,這其實也在暗示我們,即使是身處絕境,也不要放棄奮鬥。再說了,情況...
線性dp 攔截飛彈 最長上公升子串行模型 貪心
強相關 線性dp 最長上公升子串行 模板題 最長上公升子串行模型 貪心解法 本題高階版 線性dp 飛彈防禦系統 最長上公升子串行模型 貪心 dfs 1010.攔截飛彈 重點 線性dp lis問題 貪心 思路 基於這個思想,第一問就寫個lis就行了。第二問實現方式為 線性dp 最長上公升子串行 模板題...