題目傳送門
最少攔截系統
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈.
怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裡來求救了,請幫助計算一下最少需要多少套攔截系統.
逆向思維的最長上公升子串行
d p[
i]
dp[i]
dp[i
]代表到達第i
ii位時,需要的系統的最小值
轉移方程為dp[
i]=m
ax(d
p[i]
,dp[
j]+1
)whe
na[j
i]
dp[i]=max(dp[i], dp[j]+1)\ when\ a[j]dp
[i]=
max(
dp[i
],dp
[j]+
1)wh
ena[
j]i]
即為後面的飛彈高於前面的某個飛彈的高度的時候即增加乙個系統,最大值即為在前面已有的系統的最大值上是否增加
#pragma gcc optimize("-ofast","-funroll-all-loops")
#include
#include
#include
#include
#include
using namespace std;
#define endl '\n'
#define inf 0x3f3f3f3f
#define int long long
#define debug(a) cout<<#a<<"="typedef
long
long ll;
const
double pi=
acos(-
1.0)
;const
double e=
exp(
1.0)
;const
int m=
1e9+7;
const
int n=
3e4+7;
inline
intmymax
(int x,
int y)
inline
intmymin
(int x,
int y)
inline
intread()
inline
void
write
(register
int x)
if(x >9)
write
(x/10);
putchar
(x %10+
'0');}
int n, a[n]
, dp[n]
;void
solve()
write
(ans)
;putchar
('\n');
}return;}
signed
main()
最少攔截系統(dp)
problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有...
最少攔截系統 基礎DP
kuangbin帶你飛 專題十二 基礎dp1 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔...
最少攔截系統(基礎DP)
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈.怎麼辦呢?多搞幾套系統唄 你說說...