Consecutive Subsequence CodeForces - 977F
题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列)
解题思路:
状态:把dp[i]定义为数列末尾为 i 的最大连续数列的长度值
状态转移方程:dp[i] = dp[i-1] + 1
再由最大连续数列最后一个值从后往前倒推出前面的所有值,到不是连续时停止
代码:
#include<bits/stdc++.h> using namespace std; const int N = 200000 + 5; int dp[N]; int a[N]; int res[N]; int main() { int n; scanf("%d", &n); int e, v; int ans = 0; for(int i = 0; i < n; i++) { scanf("%d", &v); a[i] = v; dp[v] = dp[v-1] + 1; if(ans < dp[v]) { ans = dp[v]; e = i; } } printf("%d\n", ans); int tot = 0; int flag = a[e]; for(int i = e; i >= 0; i--) { if(a[i] == flag) { res[tot++] = i + 1; flag--; } if(tot == ans) break; } for(int i = tot - 1; i > 0; i--) { printf("%d ", res[i]); } printf("%d\n", res[0]); return 0; }
作者:kindleheart
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。