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
相关文章
相关标签/搜索