C++ 题解题目:6237 等差数列关卡:枚举时空限制CPU占用时长 1秒 内存使用限制 128MB题目描述给定 �n 个数从中找出尽可能多的数使得他们能够组成一个等差数列求最长的等差数列的长度输入格式第一行是一个整数 �n 接下来一行包括了 �n 个数。输出格式对于每个输入数据输出你所找出的最长等差数列的长度输入输出样例
输入样例: 5 1 2 3 5 7
输出样例: 3
解题思路:
- 首先对输入的数列进行排序。
- 定义一个二维数组dp,dp[i][j]表示以第i个数结尾,差为j的等差数列的最长长度。
- 对于每个数dp[i][j],遍历前面的所有数,找到差为j的等差数列的最长长度。
- 最终答案为dp[i][j]中的最大值。
代码实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
sort(nums.begin(), nums.end());
vector<vector<int>> dp(n, vector<int>(20001, 1));
int ans = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
int diff = nums[i] - nums[j];
dp[i][diff + 10000] = max(dp[i][diff + 10000], dp[j][diff + 10000] + 1);
ans = max(ans, dp[i][diff + 10000]);
}
}
cout << ans << endl;
return 0;
}
复杂度分析: 该算法的时间复杂度为O(n^2),空间复杂度为O(n)
原文地址: https://www.cveoy.top/t/topic/ixTp 著作权归作者所有。请勿转载和采集!