题目链接:http://codeforces.com/problemset/problem/977/F
题意:给你一串数字序列,让你求最长上升子序列,但是这个子序列呢,它的数字得逐渐连续挨着。
题解:LIS的求法去做嘛。经典dp,处理的时候记录一下最大起点的下标,然后在最后循环找的时候,对比一下当前的值是否在逐渐+1即可。
坑点大概就是会RE。QAQ就是开不下dp的数组了嘛。
1 #include<iostream> 2 #include<vector> 3 #include<map> 4 using namespace std; 5 #define Max 1000005 6 #define ll long long 7 8 map <int,int> dp; 9 ll num[Max]; 10 int main(){ 11 int n; 12 cin>>n; 13 14 for(int i = 0; i < n ;i++){ 15 cin>>num[i]; 16 } 17 ll ans = -1; 18 ll val = 0; 19 for(int i = 0 ;i < n ;i++){ 20 dp[ num[i] ] = max(dp[ num[i] ], dp[ num[i] - 1] + 1); 21 if(dp[ num[i] ] > ans){ 22 ans = dp[ num[i] ]; 23 val = num[i]; 24 } 25 } 26 vector<int> res; 27 int log = val - ans + 1; 28 for(int i = 0 ;i < n ;i++){ 29 if(num[i] == log){ 30 res.push_back(i+1); 31 log++; 32 } 33 } 34 cout<<res.size()<<endl; 35 for(int i = 0 ; i < res.size(); i++){ 36 cout<<res[i]<<" "; 37 } 38 39 40 return 0; 41 }