标签:dp,最长上升子序列
题目
Given an array A
of integers, return the length of the longest arithmetic subsequence in A
.
Recall that a subsequence of A
is a list A[i_1], A[i_2], ..., A[i_k]
with 0 <= i_1 < i_2 < ... < i_k <= A.length - 1
, and that a sequence B
is arithmetic if B[i+1] - B[i]
are all the same value (for 0 <= i < B.length - 1
).
Example 1:
Input: [3,6,9,12]
Output: 4
Explanation:
The whole array is an arithmetic sequence with steps of length = 3.
Example 2:
Input: [9,4,7,2,10]
Output: 3
Explanation:
The longest arithmetic subsequence is [4,7,10].
Example 3:
Input: [20,1,15,3,10,5,8]
Output: 4
Explanation:
The longest arithmetic subsequence is [20,15,10,5].
Note:
2 <= A.length <= 2000
0 <= A[i] <= 10000
自己错误的思路
- 看到数组每个数的最大只有10000
- 以为就可以用-10000到10000直接找
- 但是结果不对[1,2,5,6],自己的代码也会得到4
- 因为不能单纯的用d来作为状态,数与数之间有连续性
错误code
//
// Created by hanshan on 19-6-12.
//
class Solution {
public:
int longestArithSeqLength(vector<int>& A) {
vector<int> dp(10000 + 5, 1);
vector<int> dp2(10000 + 5, 1);
dp[0] = 1;
int ans = -1;
for(auto iter = begin(A); iter != end(A); iter++){
for(int j=0; j<10000+1;j++){
if(find(begin(A), iter, *iter - j) != iter){
dp[j] += 1;
ans = max(ans, dp[j]);
}
if(find(begin(A), iter, *iter + j) != iter){
dp2[j] += 1;
ans = max(ans, dp2[j]);
}
}
}
return ans;
}
};
最长上升子序列思路
- 开始也想到用这个思路
- 可以用vector<vector> dp0 来表示每个位置值可以的d
- 用另一个vector<vector> dp1表示对应位置的d的个数
- 代码中直接使用map<int,map<int, int>> dp,dpid=cnts,表示位置到i等差为d的个数
LCS 代码
//
// Created by hanshan on 19-6-12.
//
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
class Solution {
public:
int longestArithSeqLength(vector<int>& A) {
map<int, map<int, int>> dp;
int ans = -1;
for(int i=0; i<A.size(); i++){
for(int j=0; j<i; j++){
int d = A[i] - A[j];
dp[i][d] = dp[j].count(d) ? dp[j][d] + 1 : 2;
ans = max(ans, dp[i][d]);
}
}
return ans;
}
};