題意:中文略
解題思路:幾天前a的題,這個題讓你求出所給序列中,有幾條最長下降子串行(相對),但是要是單純的去求最長下降子串行的條數,就需要多搞個迴圈記錄下降子串行的條數,時間可能會超時。 仔細想想這個題就是求最長上公升子串行,並輸出最長有多長就行了。
具體是如何想的呢,就是我們把整個問題反過來思考,設dp[i]為能攔截到的最高的高度,如果存在a[j] > a[i] 那麼這個飛彈就不能被系統攔截,就需要增加乙個攔截系統,並更新最高能攔截到的飛彈高度。
於是狀態轉移方程:dp[i] = max(dp[i], dp[j] + 1)於是此問題變成了, lis。 關鍵是思路,這個題就是看思路廣不廣。
description
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈.
怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裡來求救了,請幫助計算一下最少需要多少套攔截系統.
input
輸入若干組資料.每組資料報括:飛彈總個數(正整數),飛彈依此飛來的高度(雷達給出的高度資料是不大於30000的正整數,用空格分隔)
output
對應每組資料輸出攔截所有飛彈最少要配備多少套這種飛彈攔截系統.
sample input
8 389 207 155 300 299 170 158 65
sample output
2
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
int buf[10];
//整型變數快速輸入輸出函式
inline int readint()
return x;
}inline void writeint(int i)
for(int j = p - 1 ; j >= 0 ; --j) putchar('0' + buf[j]);}//
#define max_n 100005
const int inf = 0x3f3f3f3f;
int a[max_n];
int dp[max_n];
int main()
for(int i = 0 ; i < n ; i++)
}if(dp[i] > max_sum)
}cout<
hdu1257 最少攔截系統
解釋 當炮彈乙個接乙個的從空中飛來時,系統可以攔住比它攔住前乙個高度低的炮,比前乙個高的不攔,給第二個系統攔 problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過...
hdu 1257 最少攔截系統
題目大意 給定一串飛彈的高度,問最少需要多少飛彈攔截系統。思路 lis 分析 首先,至少需要一套攔截系統,一開始可以打到第一顆飛彈的位置。之後每來一顆飛彈更新一下系統能打到的高度。一旦有一顆飛彈所有系統都打不到了,增加乙個系統。那麼就會得到乙個序列,每個系統目前能打到的最高位置。這個序列是遞增的,後...
HDU1257 最少攔截系統
problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有...