算法复习笔记之重要算法(二)
目录:
1.1编写算法求最大子序列和:
详细题目以及要求见:acm.hdu.edu.cn/showproblem.php?pid=1003
1.1.1枚举法 时间复杂度为n的平方,超时
int max(int a[],int n) { int i,j,maxsum=0,m; for(i=0;i<n;i++) { m=0; for(j=i;j<n;j++) { m=m+a[j]; if(m>maxsum) maxsum=m; } } return maxsum; }
1.1.2
分治法
int maxsum(int a[],int left,int right) { int maxleft,maxright,mid,leftsum=0,rightsum=0; int maxlefttmp=0,maxrighttmp=0; if(left==right) return a[left]>0?a[left]:0 mid=(left+roght)/2; maxleft=maxsum(a,left,mid);//left part max sum maxright=maxsum(a,mid+1,right);//right part max sum for(int i=mid;i>=left;i--) { leftsum+=a[i]; if(leftsum>maxlefttmp) maxlefttmp=leftsum; } for(int i=mid+1;i<=right;i++) { rightsum+=a[i]; if(rightsum>maxrighttmp) maxrighttmp=rightsum; } return max(maxleft,maxright,maxlefttmp+maxrighttmp); }
qaq >_> 估计 目测 还是会爆 时间复杂度为nlogn
1.1.3 dp,复杂度为O(n)
int max(int a[],int n) { int i,maxsum=0,m=0; for(i=0;i<n;i++) { m=m+a[i]; if(m>maxsum) maxsum=m; else if(m<0) m=0; } return maxsum; }短小精悍 嘻嘻 哈哈哈