求一个 unsorted 数组中最长的等差数列(int 数组,可递增或者递减)
默认我的输入是递增的。
参照论文中的
但是我觉得它没有初始化为2有点问题,所以修改了以下先初始化。
主要思路是L[i,j]存储的不是arr[i,j]子数组的最长递增序列,而是存储的是以A[i],A[j]为开头2个数字的序列,这样存储了递增值,又保存了长度值。
原来理解错了还以为论文本身有问题,后来发现是我想错了。
动态规划选择存储什么还是很重要的!
代码如下,但是不保证正确性,因为没有测试输入。
int longestArithProg(vector<int> arr)
{
int maxlen=2;
int n=arr.size();
vector<vector<int>> len(n,vector<int>(n,2));
int lmax,rmax;
for (int i=0;i<n;i++)
{
len[i][i]=1;
}
for (int j=n-2;j>=0;--j)
{
int i=j-1;
int k=j+1;
while (i>=0 && k<n)
{
if (arr[i]+arr[k]<arr[j]*2)
{
++k;
}
else if (arr[i]+arr[k]>arr[j]*2)
{
len[i][j]=2;
--i;
}
else//arr[i]+arr[k]==arr[j]+arr[j]
{
len[i][j]=len[j][k]+1;
if (maxlen<len[i][j])
{
lmax=i;
rmax=j;
maxlen=len[i][j];
}
--i;
++k;
}
}
}
vector<int> r;
int interval=arr[rmax]-arr[lmax];
for (int val=arr[lmax];val<arr[lmax]+maxlen*interval;val+=interval)
{
r.push_back(val);
}
return maxlen;
}
参考:
http://compgeom.cs.uiuc.edu/~jeffe/pubs/pdf/arith.pdf