您的位置:首页 > 其它

最大子序列和问题的求解

2012-07-05 08:51 190 查看
        前些天看了一篇博客,说程序员要想在技术上有所提升,要有良好的基础,我还是比较认同这一点:基础很重要,没有稳固基础的高楼大厦是不能长久屹立的,同时也感叹自己书籍阅读较少。心动不如行动,就从中午午休开始吧,找找了比较经典的《数据结构与算法分析-c语言描述版》,机械工业出版社出版,想必大家早就读过了,只恨自己醒悟太晚。

        在此简单的介绍一下小弟的基本情况吧。我,硕士研究生(专业为计算机技术)在读,本科毕业于一所普通的学校,本科期间因专业的关系对计算机的知识接触不是很多。计算机专业基础知识的匮乏让我深受其苦,学习理论课时和其他同学的差距蛮大,心里那叫一个苦不堪言啊!

        废话不说,言归正传。我看了一个关于最大子序列的问题,又根据个人目的稍微改进了,在此和大家分享。此博客算是个人计算机基础知识积累历程的开始吧。

 

题目描述:给定一个整数数组a
,数组元素为a[1],a[2],……(其中也有一些负数),求子序列,使其和最大。例如 -2,11,-4,13,-5,-2的最大子序列和为20,(为11,-4,13)。

书本中给定的算法是这样的:

int Maxsub ( int a[], int N )

{
int max , thismax , j;

max=thismax=0;
for ( j=0 ; j<M ; j++ )
{
thismax += a[j];
if(thismax>max)
max=thismax;
else
if(thismax<0)
thismax=0;
}
return max;

}

在此基础上,若我们要求取子序列和最大时的子序列,可设两哨兵low 和 hig,高位哨兵的取值较简单,每次对 max 赋值后 hig=j , 则最终得到的hig即为高位哨兵。利用反推的方法来求取低位哨兵 low ,即由 hig 和 max 求 low的位置。

可将上边的算法修改为:

void Maxsub ( int a[], int N )

{
int max , thismax , j;

int low,hig;

max=thismax=0;
for(j=0;j<M;j++)
{
thismax+=a[j];
if(thismax>max)

{
max=thismax;

hig=j;

}
else
if(thismax<0)
thismax=0;
}

j=hig;

thismax=0;

while(thismax!=max)
{

thismax+=a[j];

j--;
}

low=j+1;

for ( j=low ; j<=hig ; j++)

printf("%d ",array[j[);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: