洛谷P1020 最長不上子序列及其個數
題目大意:輸入若干導彈的高度,用炮彈攔截,第一發炮彈能達到任意高度,第i發炮彈不能高於第i-1發炮彈。求一個炮彈系統能攔截的最多的導彈和若要攔截所有的導彈最少需要有多少炮彈系統
第一問即求最長不上升子序列的長度
第二問即求最長不上升子序列的個數
而求最長不上升子序列的個數即求最長上升子序列的長度
簡單證明:因為在序列中的每一次資料的上升意味著最長不上升子序列有一個新的起點
#include <cstdio>
#include <sstream>
#include <iostream>
using namespace std;
const int maxn = 1e5 + 10;
const int INF = 2147483640;
int dp[maxn];
int a[maxn];
int bin_find1(int l, int r, int key)
{
int mid;
while(l <= r)
{
mid = (l+r)>>1;
if(key > dp[mid]) r = mid - 1;
else l = mid + 1;
}
return r + 1;
}
int bin_find2(int l, int r, int key)
{
int mid;
while(l <= r)
{
mid = (l+r)>>1;
if(key <= dp[mid]) r = mid - 1;
else l = mid + 1;
}
return r + 1;
}
int main()
{
int i;
int n = 0;//a[]長度
int len = 0;
int pos;
while(~scanf("%d", &a[++n])) ;
--n;
dp[0 ] = INF;
for(i = 1; i <= n; ++i)
{
if(a[i] <= dp[len]) dp[++len] = a[i];
else
{
pos = bin_find1(1, len, a[i]);
dp[pos] = a[i];
}
}
printf("%d\n", len);
//第二問
len = 0;
dp[0] = -INF;
for(i = 1; i <= n; ++i)
{
if(a[i] > dp[len]) dp[++len] = a[i];
else
{
pos = bin_find2(1, len, a[i]);
dp[pos] = a[i];
}
}
printf("%d\n", len);
return 0;
}
相關推薦
洛谷P1020 最長不上子序列及其個數
題目大意:輸入若干導彈的高度,用炮彈攔截,第一發炮彈能達到任意高度,第i發炮彈不能高於第i-1發炮彈。求一個炮彈系統能攔截的最多的導彈和若要攔截所有的導彈最少需要有多少炮彈系統 第一問即求最長不上升子序列的長度 第二問即求最長不上升子序列的個數 而求最長不
洛谷2766最長不下降子序列問題
題目連結:最長不下降子序列問題 這一個問題雖然有三小問,但是每一個小問題的連線非常緊密 對於第一問,直接\(O(n^2)\)水過,你要用\(O(nlogn)\)當然也可以啊 二三問考慮使用網路流求解 我們利用第一問中得到的dp關係來建圖: 很明顯的是這裡的每一個數只能用一次,所以我們將每一個點拆成兩
#動態規劃,最大流#洛谷 2766 最長不下降子序列問題
題目 求序列的最長不下降子序列的長度及最長不下降序列的個數 還有求若第一個數和最後一個數可以取無限次,那麼會有多少個最長不下降序列 分析 第一問動態規劃Fi=max{Fj+1}Fi=ma
九度OJ-1112-導彈攔截-最長不增子序列
研究生 -h 計算 不能 problems ear 來源 分隔 std 題目1112:攔截導彈 時間限制:1 秒 內存限制:32 兆 特殊判題:否 提交:5218 解決:2603 題目描述: 某國為了防禦敵國的導彈襲擊,開發出一種導彈攔截系統。但是這種導彈攔截系統有一
O(n log n)求最長上升子序列與最長不下降子序列
clas 每一個 for spa pen pan close color style 考慮dp(i)表示新上升子序列第i位數值的最小值.由於dp數組是單調的,所以對於每一個數,我們可以二分出它在dp數組中的位置,然後更新就可以了,最終的答案就是dp數組中第一個出現正無窮的位
SSl 2756_獨立集_最長不下降子序列
pri == clas stdio.h 我們 心情 [] 題目 can 題目描述 有一天,一個名叫順旺基的程序員從石頭裏誕生了。又有一天,他學會了冒泡排序和獨立集。在一個圖裏,獨立集就是一個點集,滿足任意兩個點之間沒有邊。於是他就想把這兩個東西結合在一起。眾所周知,獨立集是
最長不下降子序列nlogn算法詳解
利用 pos 要求 它的 子序列 解決 post 第一個 就是 今天花了很長時間終於弄懂了這個算法……畢竟找一個好的講解真的太難了,所以勵誌我要自己寫一個好的講解QAQ 這篇文章是在懂了這個問題n^2解決方案的基礎上學習。
luogu2766 最長不下降子序列問題
nic eof 什麽 () num can cpp for 分層圖 第一問DP水過。dp[i]代表以i結尾的最長不下降子序列長度。 二三問網絡流。 第二問是說每個子序列不能重復使用某個數字。 把每個點拆成p(i),q(i)。連邊。 要是dp[i]=1,連源,p(i) 要是d
【寧波市第23屆中小學生計算機程序設計競賽(初中組)T3】馬(排序,最長不下降子序列)
決定 pri 需要 程序設計 分開 組成 最長 只有一個 應該 題目描述 戰神阿瑞斯聽說2008年在中華大地上,將舉行一屆規模盛大的奧林匹克運動會,心中頓覺異常興奮,他召集了n位天將,騎著他們自己的天馬,準備在廣闊的天空上,舉行一場空前的天馬天將列隊表演。天馬在熟悉了自己的
「網絡流24題」最長不下降子序列問題
計算 二分圖匹配 原理 最長 span 情況 遞增 mic ros 傳送門:>Here< 題意: 給定正整數序列$x_1,...,x_n$ (1)計算其最長不下降子序列的長度s。 (2)計算從給定的序列中最多可取出多少個長度為s的不下降子序列。 (
動態規劃-導彈攔截(求最長不上升子序列和最長上升子序列)
lower_bound(a,a+n,i)函式 返回從陣列a到a+n中第一個>=i的元素地址 upper_bound(a,a+n,i)函式 返回從陣列a到a+n中第一個>i的元素地址 #include<cstdio> #include<algorithm> #i
最大連續子序列和/最長不下降子序列/最長公共子序列/最長迴文子串
//最大連續子序列和 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 10010; int A[maxn],dp[maxn]; int main(){ int
codeup21280:最長不下降子序列問題(LIS:Longest Increasing Sequence---dp基礎題)
題目地址:http://codeup.cn/problem.php?id=21280&csrf=BoAHUd12vsqOUBpidoqhiueWMmKAEEdM 21280: 最長上升子序列 題目描述 一個數列ai如果滿足條件a1 < a2&nb
HDU 1160 FatMouse's Speed(動態規劃 LIS最長不下降子序列)
題目連結: #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cstdlib> #include <map>
程式設計基礎33 最長不下降子序列
1045 Favorite Color Stripe (30 分) Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in
最長不下降子序列nlogn
b[i]表示長度為i的最長不下降子序列的最小末尾元素的值顯然它是單調遞增的,滿足二分性質,然後就可以愉快地二分啦. #include<iostream> #include<cstdio> #include<queue> #include<algorithm&g
P2766 最長不下降子序列問題 題解(網路流)
題目連結 最長不下降子序列問題 解題思路 分成三小問解決。 第一小問,求\(LIS\),因為\(n<=500\),直接\(O(N^2)\)暴力求解即可。 第二三小問,建立模型用網路流求解。 對於第二小問 \((1)\)首先,因為每個點只能使用一次,考慮拆點,把每一個點拆成\(i,n+i\)兩個點,
ACM訓練 身高排隊、導彈攔截 [最長不下降子序列,最長不升子序列和不升子序列的最小覆蓋]
題目 題目分析 整體程式碼 相似問題 題目 題目描述 若干人排成一行,且身高分別為b1,b2,…,bn。準備從中選出一組滿足身高不降的人組成一隊。 例如13,7,9,16,3
PAT 1045 Favorite Color Stripe(最長不遞減子序列)
Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in her favorite order by cutting
poj 3670Eating Together(最長不上升最長不下降子序列)
Description The cows are so very silly about their dinner partners. They have organized themselves into three groups (conveniently number