先放題:hdu 5256
序列變換
我們有乙個數列a1,a2...an,你現在要求修改數量最少的元素,使得這個數列嚴格遞增。其中無論是修改前還是修改後,每個元素都必須是整數。
請輸出最少需要修改多少個元素。
input 第一行輸入乙個t(1
≤t≤10
)'>t(1≤t≤10)
t(1≤t≤10),表示有多少組資料 t(
1≤t≤
10)'>t(
1≤t≤
10)'>每一組資料: t(
1≤t≤
10)'>t(
1≤t≤
10)'>第一行輸入乙個n(1
≤n≤10
5)'>n(1≤n≤105)
n(1≤n≤105),表示數列的長度 t(
1≤t≤
10)'>t(
1≤t≤
10)'>n(1
≤n≤10
5)'>第二行輸入n個數a1,
a2,.
..,a
n'>a1,a2,...,an
a1,a2,...,an。 t(
1≤t≤
10)'>n(1
≤n≤10
5)'>a1,
a2,.
..,a
n'>每乙個數列中的元素都是正整數而且不超過10
6'>106
106。
output對於每組資料,先輸出一行
case #%d:
然後輸出最少需要修改多少個元素;
output:
221 10
32 5 4
case #1:0case #2:
1 該題思路:構造序列b[i]=a[i]-i;答案為序列總長度減去b的最長不下降子串行的長度;
這題要求最長不下降子串行;
剛開始寫錯了。。後來網上看到了乙個nlog n的做法
//最長不下降子串行nlogn song
#include
#include
using
namespace
std;
int a[40005
];in
t d[
40005
];int
main()
d[1]=a[1]; //
初始化
int len=1
;
for (int i=2;i<=n;i++)
}printf(
"%d\n
",len);
return0;
}
(裡面求最長上公升子串行的也標註了)
還有個n2的做法,應該只能處理少數資料
#include#includeusing
namespace
std;
int num,n,a[1001],sum[1001
];int
main()
printf("%d
",num);
}
然後是題目ac的**:
#include #include#include
#include
#include
#include
using
namespace
std;
const
int maxen=100010
;int
t,n,a[maxen],b[maxen],dp[maxen];
int main(void
)
int len=1
; dp[
1]=b[1
];
for(int i=2;i<=n;++i)
else
}printf(
"case #%d:\n
",t);
printf(
"%d\n
",n-len);
t++;
}return0;
今天又學了這兩個方法~ヾ(◍°∇°◍)ノ゙2019.3.5
--九點了肚子還是好飽的猴
最長上公升子串行 和 最長不下降子串行
最長上公升子串行 是嚴格上公升的,alower bound 返回序列中大於等於key值的第乙個數 比如說序列 1 2 3 4 5,key值為3,使用lower bound返回第三個數 最長不下降子串行 不是嚴格上公升,可以存在多個數相等的情況,用upper bound upper bound 返回序...
最長上公升子串行,最長不下降子串行
最長上公升子串行 include includeusing namespace std const int n 23333 12 int dp n a n int n int binarysearch int k,int len else if k dp mid else mid l r 1 ret...
nlogn求最長上公升子串行或最長下降子串行
思路很簡單,維護乙個長度為k時的最長上公升子串行結尾元素是d k 的陣列,因為前面的元素已經插入了,後面的元素對前面的只有更優的影響,所以只掃一遍原陣列就能求得。推薦看這篇部落格 講得很詳細 include using namespace std const int n 1e5 7 int a n ...