Codeforces 479【F】div3

题目链接: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 }
View Code

 

posted @ 2018-05-07 23:30  甜酒果。  阅读(247)  评论(0编辑  收藏  举报