description
大家都知道小明最喜歡研究跟序列有關的問題了,可是也就因為這樣,小明幾乎已經玩遍各種序列問題了。可憐的小明苦苦地在各大**上尋找著新的序列問題,可是找來找去都是自己早已研究過的序列。小明想既然找不到,那就自己來發明乙個新的序列問題吧!小明想啊想,終於想出了乙個新的序列問題,他欣喜若狂,因為是自己想出來的,於是將其新序列問題命名為「小明序列」。
提起小明序列,他給出的定義是這樣的:
①首先定義s為乙個有序序列,s=,n為元素個數 ;
②然後定義sub為s中取出的乙個子串行,sub=,m為元素個數 ;
③其中sub滿足 ai1 < ai2 < ai3 < ... < aij-1 < aij < aij+1 < ... < aim ;
④同時sub滿足對於任意相連的兩個aij-1與aij都有 ij - ij-1 > d (1 < j <= m, d為給定的整數);
⑤顯然滿足這樣的sub子串行會有許許多多,而在取出的這些子串行sub中,元素個數最多的稱為「小明序列」(即m最大的乙個sub子串行)。
例如:序列s= ,其中d=1;
可得「小明序列」的m=2。即sub=或者或者都是「小明序列」。
當小明發明了「小明序列」那一刻,情緒非常激動,以至於頭腦凌亂,於是他想請你來幫他算算在給定的s序列以及整數d的情況下,「小明序列」中的元素需要多少個呢?
input
輸入資料多組,處理到檔案結束;
輸入的第一行為兩個正整數 n 和 d;(1<=n<=10^5 , 0<=d<=10^5)
輸入的第二行為n個整數a1 , a2 , a3 , ... , an,表示s序列的n個元素。(0<=ai<=10^5)
output
請對每組資料輸出「小明序列」中的元素需要多少個,每組測試資料輸出一行。
sample input
2 01 25 1
3 4 5 1 2
5 23 4 5 1 2
sample output
2lis的變形 本來我們求的最大遞增子串行間距為1 現在變為k2
#include#include#define inf 0x3f3f3f3f
using namespace std;
int dp[100001];//dp[i]記錄i點前的最長長度
int s[100001];
int a[100001];//輔助陣列 儲存子串行 記錄插入的數
int n,k;
int erfen(int d)
else
}return l;
}int main()
for(int i=1;i<=n;i++)
int j=i-k; //距離為k
if(j>0&&a[dp[j]]>s[j])
}printf("%d\n",len);
}return 0;
}
hdu4521 小明系列問題 小明序列 線段樹
題意 有多組測試資料,每組資料的n和d表示,有n個數,求間距大於d的最長上公升序列。題解 1 按權值從小到大排序,權值相同的時候按下標從大到小排序。2 線段樹維護符合條件的上公升子串行,然後去找當前情況在其前面符合間距的範圍裡找當前最長的上公升子串行,再更新進去就可。include include ...
HDU 4521 小明序列 線段樹 DP
題目鏈結 include include include include include include include include includeusing namespace std const int maxn 100005 const int inf 1 30 0x7f int n,d ...
小明系列故事 買年貨(HDU)
題意理解 有n個可以買的年貨,每個年貨有單價,抵扣的積分和實際的價值,小明手裡有v1的錢,v2的積分,可免費的年貨數量k。問如何買才能使年貨總的價值最大?問題分析 多維01揹包問題,用dp。動態規劃要找狀態,然後找狀態轉移方程。對於本題,狀態是dp ii jj kk ll 表示前ii個年貨花了jj錢...