由題意不難看出,要求最多能夠攔截多少枚飛彈,即在按照襲擊順序排列的飛彈高度中求其最長不增子序列。所謂不增子序列,即子串行中排在前面的數字不比排在後面的數字小。求最長不增子序列的原理與求最長遞增子串行的原理完全一致,只是遞推關係相應的發生一些變化,遞推關係如下:
int list[26];//按襲擊事件順序儲存各飛彈高度
int dp[26];//dp[i]儲存以第i個飛彈結尾的最長不增子序列長度
int main()
for(int i=1;i<=n;i++)
}dp[i]=tmax;//將dp[i]儲存為最大值
}int ans=1;
for(int i=1;i<=n;i++)//找到以每乙個元素結尾的最長不增子序列的最大值
//該最大值即為答案
printf("%d\n",ans);
}return 0;
}其時間複雜度為 o(n*n),空間複雜度為 o(n)。由分析過程可知,最長遞增子串行問題的求解思想,不僅可以用來解決單純的最長遞增子串行問題,也可以經過模擬來求解其它大小關係確定的子串行最長長度。
最長遞增子串行問題,是我們接觸的第乙個真正意義上的動態規劃問題。
回顧它的特點:
首先,將這個問題分割成許多子問題,每個子問題為確定以第 i 個數字結束的遞增子串行最長長度。
其次,這些子問題之間存在某種聯絡,以任意乙個數字結束的遞增子串行長度,與以排在該數字之前所有比它小的元素結尾的最長遞增子串行長度有關,且僅與其數字量有關,而與其具體排列無關。
最後,規模較小的子問題是容易被確定的。於是,像遞推求解一樣,一步步求得每個子問題的答案,進而由這些答案推得後續子問題的答案。
刷題總結 攔截飛彈(ssoj)
noip1999 提高組試題 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸...
Day of week 九度教程第7題
其大意為,輸入乙個日期,要求輸出該日期為星期幾。星期幾是以七為週期迴圈的,那麼只需要知道 1.今天是星期幾 2.今天和所給定的那天相隔幾天。利用其對7求餘數便可以知道所給定的那天是星期幾。include include define isleapyeap x x 100 0 x 4 0 x 400 ...
Sort 九度教程第11題
時間限制 1 秒 記憶體限制 128 兆 特殊判題 否 題目描述 給你n個整數,請按從大到小的順序輸出其中前m大的數。輸入 每組測試資料有兩行,第一行有兩個數n,m 0 include using namespace std bool cmp int x,int y int main 初始化,將每個...