题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2,4,1,16,7,5,11,9}中,数对之差的最大值是11,是16减去5的结果。
(1)分治策略
#include<iostream>
using namespace std;
const int n=8;
int max(int x,int y,int z)
{
x=x>y?x:y;
return x>z?x:z;
}
int Difference(int a[],int start,int end,int &M,int &m)
{
if(start==end)
{
M=m=a[start];
return -100;
}
int middle=start+(end-start)/2;
int left,right,left_max,left_min,right_max,right_min;
left=Difference(a,start,middle,M,m);
left_max=M;
left_min=m;
right=Difference(a,middle+1,end,M,m);
right_max=M;
right_min=m;
M=left_max>right_max?left_max:right_max;
m=left_min<right_min?left_min:right_min;
return max(left,right,left_max-right_min);
}
int main()
{
int a[n]={2,4,1,16,7,5,11,9};
int M,m;
cout<<Difference(a,0,n-1,M,m)<<endl;
return 0;
}
#include<iostream>
using namespace std;
const int n=8;
int max(int x,int y)
{
return x>y?x:y;
}
int Difference(int a[])
{
int i;
int *diff=new int[n-1];
for(i=0;i<n-1;i++)diff[i]=a[i]-a[i+1];
int g=diff[0],f=diff[0];
for(i=1;i<n-1;i++)
{
g=max(g+diff[i],diff[i]);
f=max(f,g);
}
return f;
}
int main()
{
int a[n]={2,4,1,16,7,5,11,9};
cout<<Difference(a)<<endl;
return 0;
}
(3)动态规划
#include<iostream>
using namespace std;
const int n=8;
int max(int x,int y)
{
return x>y?x:y;
}
int Difference(int a[])
{
int i,f=0,M=0;
for(i=1;i<n;i++)
{
f=max(f+a[i-1]-a[i],a[i-1]-a[i]);
if(f>M)M=f;
}
return M;
}
int main()
{
int a[n]={2,4,1,16,7,5,11,9};
cout<<Difference(a)<<endl;
return 0;
}