Codeforces 479【F】div3

題目連接:http://codeforces.com/problemset/problem/977/Fios

 

題意:給你一串數字序列,讓你求最長上升子序列,可是這個子序列呢,它的數字得逐漸連續挨着。數組

 

題解:LIS的求法去作嘛。經典dp,處理的時候記錄一下最大起點的下標,而後在最後循環找的時候,對比一下當前的值是否在逐漸+1便可。ide

坑點大概就是會RE。QAQ就是開不下dp的數組了嘛。spa

 

 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 }
View Code
相關文章
相關標籤/搜索