刚开始一时半会没想出来,不过看了题解才恍然大悟,感觉对二维的动态规划还是挺不熟悉的,还得加强练习
题解如下
class Solution {
public:
int longestArithSeqLength(vector<int>& nums) {
int n = nums.size();
int f[n][1001];
memset(f,0,sizeof(f));
int ans = 0;
for(int i = 1;i < n; i++){
for(int k = 0;k < i; k++){
int j = nums[i] - nums[k] + 500;
f[i][j] = max(f[i][j],f[k][j]+1);
ans = max(ans,f[i][j]);
}
}
return ans + 1;
}
};
规划递推式为
f[i][j] = max(f[i][j],f[k][j]+1);
j为公差,每个对应的元素都有相应从0到自身值的公差数组,dp本质是空间换时间,本题思想就是求出每个元素对应的公差数组的最长值,然后再递推ans,再输出就好了。