给你一个整数数组 nums,返回nums中最长等差子序列的长度
一. 动态规划
该题类似最长递增子序列
dp[i][j]定义为以i为结尾,公差为j的最长等差数列长度
class Solution {
public:
int longestArithSeqLength(vector<int>& nums) {
//dp[i][j]定义为以i为结尾,公差为j的最长等差数列长度
int n = nums.size();
vector<map<int,int>> dp(n);
int mx = 1;
for(int i=1;i<n;i++){//对每一个数
for(int j=i-1;j>=0;j--){//遍历比较之前的数
int val = nums[i] - nums[j];
if(dp[i].count(val)!=0) continue;//相同公差不再计算,关键剪枝语句
if(dp[j].count(val)) dp[i][val] = max(dp[i][val],dp[j][val]+1);
else dp[i][val] = 2;
mx = max(mx,dp[i][val]);
}
}
return mx;
}
};
标签:val,nums,int,mx,等差数列,最长,dp
From: https://www.cnblogs.com/929code/p/17344342.html