HDU 6197 array array array(最長上升或下降子序列)
題目地址
題意:給你一個長度為n的序列,你可以刪除m個元素,使得這個序列變成一個單調上升或下降序列。
思路:就是求最長上升或下降子序列長度是不是大於n-k。
推薦一個理解nlogn時間複雜度的最長上升子序列的模板傳送門。
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <iomanip>
#define N 100010
#define M 100010
#define LL __int64
#define inf 0x3f3f3f3f
#define lson l,mid,ans<<1
#define rson mid+1,r,ans<<1|1
#define getMid (l+r)>>1
#define movel ans<<1
#define mover ans<<1|1
using namespace std;
const LL mod = 1000000007;
int numb[N], dp[N], numa[N];//dp中存的是長度為(i+1)上升系列中最大的最小的,越前面越小(一定)
int BiSearch(int len, int key) {//二分法
int l = 0, r = len - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (dp[mid]>key) {
r = mid - 1;
}
else if (dp[mid]<key) {
l = mid + 1;
}
else {//如果當前的正好等於所以就不用改變了
return mid;
}
}
return l;
}
int main() {
cin.sync_with_stdio(false);
int n, m, T;
cin >> T;
while (T--) {
cin >> n >> m;
for (int i = 0; i<n; i++) {
cin >> numa[i];
numb[i] = -numa[i];//取反每個數字,這樣求最長下降又 可以用最長上升了。
}
int len = 1;
dp[0] = numa[0];//意義是長度為1的當前最小值(但是我是從0開始的所以後面都要減一)
for (int i = 1; i<n; i++) {
if (numa[i]>dp[len - 1]) {
dp[len] = numa[i];//長度可以加一
len++;
}
else {
int pos = BiSearch(len, numa[i]);//二分找到最大的長度能夠吧最大值變小的長度
dp[pos] = numa[i];//改變那個值後面的結果(這樣那個長度的最大值就變小了,注意那個+1,-1)
}
}
int lena = len;
len = 1;
dp[0] = numb[0];
for (int i = 1; i<n; i++) {
if (numb[i]>dp[len - 1]) {
dp[len] = numb[i];
len++;
}
else {
int pos = BiSearch(len, numb[i]);
dp[pos] = numb[i];
}
}
int lenb = len;
if (n == m || n - m <= lena || n - m <= lenb) {
cout << "A is a magic array." << endl;
}
else {
cout << "A is not a magic array." << endl;
}
}
return 0;
}
推薦一篇好的講解部落格:傳送門
相關推薦
HDU 6197 array array array(最長上升或下降子序列)
題目地址 題意:給你一個長度為n的序列,你可以刪除m個元素,使得這個序列變成一個單調上升或下降序列。 思路:就是求最長上升或下降子序列長度是不是大於n-k。 推薦一個理解nlogn時間複雜度的最長上升子序列的模板傳送門。 #include <i
【最長上升和下降子序列】導彈攔截
大致思路:主要是思路問題 我本來以為用dp 想半天也沒想出來 最後一看題解 其實就是最長上升(也可以用dp做,只是我有現成方法)和下降子序列來做最簡單po一個題解然後我就寫了個求最長下降和最長上升子序列的程式碼,洛谷上是unknown error,我在本地執行第一個樣例是正確
LeetCode | Longest Substring Without Repeating Characters(最長連續不重複子串)
題目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without re
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變成一個回
HDU 1403 Longest Common Substring(最長公共前綴)
+= 前綴 pri substr 排序 turn void 數組 swap http://acm.hdu.edu.cn/showproblem.php?pid=1403 題意:給出兩個字符串,求最長公共子串的長度。 思路: 剛開始學後綴數組,確實感覺很難,但是這
HDU 5256 序列變換(最長上升子序列)
Problem Description 我們有一個數列A1,A2…An,你現在要求修改數量最少的元素,使得這個數列嚴格遞增。其中無論是修改前還是修改後,每個元素都必須是整數。 請輸出最少需要修改多少個元素。 Input 第一行輸入一個T(1≤T≤10),
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 1836 Alignment(DP max(最長上升子序列 + 最長下降子序列))
mission weight ring limit problem stream [0 sin ++ Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14486
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
HDU 1160 FatMouse's Speed (最長上升子序列)
tar 1-1000 題解 sin pid pac blank scan target 題目鏈接 題意:n個老鼠有各自的重量和速度,要求輸出最長的重量依次嚴格遞增,速度依次嚴格遞減的序列,n最多1000,重量速度1-10000。 題解:按照重量遞增排序,找出最長的速度下降子
【寧波市第23屆中小學生計算機程序設計競賽(初中組)T3】馬(排序,最長不下降子序列)
決定 pri 需要 程序設計 分開 組成 最長 只有一個 應該 題目描述 戰神阿瑞斯聽說2008年在中華大地上,將舉行一屆規模盛大的奧林匹克運動會,心中頓覺異常興奮,他召集了n位天將,騎著他們自己的天馬,準備在廣闊的天空上,舉行一場空前的天馬天將列隊表演。天馬在熟悉了自己的
【ZOJ1108】FatMouse's Speed(最長下降子序列)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 FatMouse's Speed Time Limit: 2 Seconds Memo
HDU 1160 FatMouse's Speed(動態規劃 LIS最長不下降子序列)
題目連結: #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cstdlib> #include <map>
NOIP2004合唱隊列(提高組T3)————單調佇列,動態規劃(最長上升序列,最長下降序列)
題解:本題主要考查單調佇列,動態規劃(最長上升序列,最長下降序列)。這個序列是一箇中間高,兩頭底的序列,先解決從T1到Ti這一段單調遞增的序列,再解決Ti到TK這一段單調遞減的序列(注意數值的更新)。 程式碼如下: #include<iostream> #include<
SDNUOJ 1292 動態規劃之LDS(最長下降子序列)
Description 昨天是平安夜,聖誕老人從房頂上的煙囪裡爬到小朋友床邊把禮物送給夢鄉中的小朋友,但是今年的聖誕老人是處女座的,他有很嚴重的強迫症,他從一條街的一端開始,每次送禮物進的煙囪都不能比之前進的煙囪高,而且他還想要送出最多的禮物。 Input 輸入資料只有一行,該行包含若干個資
PAT甲級1045 Favorite Color Stripe(最長不下降子序列)
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
HDU 5842.Lweb and String【最長上升子序列】【思路題】【8月20】
Lweb has a string S. Oneday, he decided to transform this string to a new sequence. You need help him determine this transformation to get a sequence whi
CSU 1225: ACM小組的佇列(最長上升子序列的個數)
題目:DescriptionACM小組每次出去活動都要排隊,但是大家總是不想按照任何規則來排好這個隊伍(大概是因為每個人都比較有個性,例如Gestapolur),所以每次隊 伍都是亂的,不過Samsar
1836 Alignment (最長上升子序列 O(nlogn))
解題思路:是POJ2533的擴充套件題。 題意不難,令到原佇列的最少士兵出列後,使得新佇列任意一個士兵都能看到左邊或者右邊的無窮遠處。就是使新佇列呈三角形分佈就對了。 但這裡有一個陷阱,看了一些別人的解題報告說“任一士兵旁邊不能存在等高的士兵”,然後又舉了一個例
LIS(最長上升子序列)問題的三種求解方法以及一些例題
摘要 本篇部落格介紹了求LIS的三種方法,分別是O(n^2)的DP,O(nlogn)的二分+貪心法,以及O(nlogn)的樹狀陣列優化的DP,後面給出了5道LIS的例題。 LIS的定義 一個數的序列bi,當b1 < b2 < … <