【例題】【動規(最長XX子序列)】NKOJ 1004 攔截導彈
NKOJ 1004 攔截導彈
時間限制 : 1000 MS 空間限制 : 65536 KB
問題描述
某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈。
輸入導彈依次飛來的高度(雷達給出的高度資料是不大於30000的正整數),計算這套系統最多能攔截多少導彈,如果要攔截所有導彈最少要配備多少套這種導彈攔截系統。
輸入格式
第一行,一個整數n,表示有n枚導彈飛來(n<=500)。
第二行,若干個整數,表示導彈依次飛來的高度
輸出格式
兩行
第一行,一個整數,表示最多能攔截的導彈數
第二行,一個整數,表示要攔截所有導彈最少要配備的系統數
樣例輸入
8
389 207 155 300 299 170 158 65
樣例輸出
6
2
來源 NOIP1999
思路:
顯然,第一問求最長不下降子序列。
對於第二問,當一套系統攔截了導彈i,若i後有導彈高度高於i,則需要增加一套系統,所以第二問即求最長上升子序列。
程式碼:
#include<cstdio>
using namespace std;
int n,a[502],f[502],g[502],ansf=-10e7,ansg=-10e7 ;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
f[i]=1;
g[i]=1;
}
for(int i=n;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
{
if(a[i]>=a[j]&&f[i]<f[j]+1) f[i]=f[j]+1;
if (a[i]<a[j]&&g[i]<g[j]+1) g[i]=g[j]+1;
if(ansf<f[i]) ansf=f[i];
if(ansg<g[i]) ansg=g[i];
}
}
printf("%d\n%d",ansf,ansg);
}
相關推薦
【例題】【動規(最長XX子序列)】NKOJ 1004 攔截導彈
NKOJ 1004 攔截導彈 時間限制 : 1000 MS 空間限制 : 65536 KB 問題描述 某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷
【ZOJ1108】FatMouse's Speed(最長下降子序列)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 FatMouse's Speed Time Limit: 2 Seconds Memo
【dp優化】LIS(最長上升子序列)長度的nlogn演算法
這道題第一反應就想到了 [CEOI96]渡輪問題 就是一個非常裸的求最長上升子序列的長度,還不要方案,非常的水。然而,常規的dp複雜度是 O(n^2) ,這道題會愉快地TLE,所以要進行nlogn級別的優化。 //O(n^2) TLE #include
LIS(最長上升子序列)問題的三種求解方法以及一些例題
摘要 本篇部落格介紹了求LIS的三種方法,分別是O(n^2)的DP,O(nlogn)的二分+貪心法,以及O(nlogn)的樹狀陣列優化的DP,後面給出了5道LIS的例題。 LIS的定義 一個數的序列bi,當b1 < b2 < … <
動規之最長上升子序列
Problem Description 一個數的序列bi,當b1 < b2 < ... < bS的時候,我們稱這個序列是上升的。對於給定的一個序列(a1, a2, ..., aN),我們可以得到一些上升的子序列(ai1, ai2, ..., aiK),這
HDU 1513 Palindrome:LCS(最長公共子序列)or 記憶化搜索
ble urn size rom str 個數 blog using reverse 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 題意: 給你一個字符串s,你可以在s中的任意位置添加任意字符,問你將s變成一個回
POJ 1458 - Common Subsequence(最長公共子序列) 題解
void 方式 mem strong 輸出 inline ron eof init 此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。 題目鏈接:http://poj.org/problem?id=1458 題目大意: 有若幹組數據,每組給出兩個字符
HDU1257 最少攔截系統 —— 貪心 or LIS(最長上升子序列)
ret pre key ear out hide 裏來 程序 http 題目鏈接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1257 最少攔截系統 Time Limit: 2000/1000 MS (Java/Oth
LCS(最長公共子序列)
rdquo 工作 dna abc sub 動態規劃 != 給定 似的 這個問題很有意思,在生物應用中,經常需要比較兩個(或多個)不同生物體的DNA片段。例如,某種生物的DNA可能為S1 = ACCGGTCGAGTGCGCGGAAGCCGGCCGAA,S2 = GTCGT
小樂樂匹配字串 (最長公共子序列)
連結:https://ac.nowcoder.com/acm/contest/301/E 來源:牛客網 小樂樂匹配字串 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld 題目描述
LeetCode題解:longest-increasing-subsequence(最長遞增子序列)
題目描述 Example: Input: [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increasing subsequence is [2,3,7,101], the length is 4. Not
SDNUOJ 1292 動態規劃之LDS(最長下降子序列)
Description 昨天是平安夜,聖誕老人從房頂上的煙囪裡爬到小朋友床邊把禮物送給夢鄉中的小朋友,但是今年的聖誕老人是處女座的,他有很嚴重的強迫症,他從一條街的一端開始,每次送禮物進的煙囪都不能比之前進的煙囪高,而且他還想要送出最多的禮物。 Input 輸入資料只有一行,該行包含若干個資
學習筆記--NLP文字相似度之LCS(最長公共子序列)
最長公共子序列 一個序列S任意刪除若干個字元得到的新序列T,則T叫做S的子序列 兩個序列X和Y的公共子序列中,長度最長的那個,定義為X和Y的最長公共子序列 例如: --字串12455與245576的最長公共子序列為2455 --字串acd
LCS(longest common subsequence)(最長公共子序列)演算法(模板)
看了幾分寫的相當好的部落格: 下面內容來轉載自上面文章 問題描述 什麼是最長公共子序列呢?好比一個數列 S,如果分別是兩個或多個已知數列的子序列,且是所有符合此條件序列中最長的,則S 稱為已知序列的最長公共子序列。 舉個例子,如:有兩條
LCS(最長公共子序列)問題
例題見挑戰程式設計競賽P56 解釋:子序列是從原序列中按順序(可以跳著)抽取出來的,序列是不連續的,這是其和子串最大的區別; 我們可以定義dp陣列為dp[i][j],表示的是s1-si和t1-ti對應的最長公共子序列長度 狀態轉移方程的話我們分為s[i],t[i]相同和s[i],t[i]不同時的情況
uva 10635(最長上升子序列)
正是太蠢了,我做這道題居然做了幾天 一道經典的LCS,但也可以轉化成LIS 將A中的資料重新編排成{1,2,3,....},然後將B中的元素與A一一對應,如果B中的元素在A中沒有出現,就直接刪除。
HDU 5256 序列變換(最長上升子序列)
Problem Description 我們有一個數列A1,A2…An,你現在要求修改數量最少的元素,使得這個數列嚴格遞增。其中無論是修改前還是修改後,每個元素都必須是整數。 請輸出最少需要修改多少個元素。 Input 第一行輸入一個T(1≤T≤10),
POJ 1458(最長公共子序列)
Time Limit: 1000MS Memory Limit: 10000K Description A subsequence of a given sequence is the given sequence with some elemen
HDU 1159:Common Subsequence(最長公共子序列)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23108 Accepted Submission(s
POJ 2533 Longest Ordered Subsequence(最長遞增子序列)
題目:DescriptionA numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence ( a1,