#include<stdio.h>
#include<stdlib.h>
//求最大子序列和问题
//解法四 无法获取位置
void getMax5(int a[],int len){
int max=0,result=0;
for(int i=0;i<len;i++){
result+=a[i];
if(max<result){
max=result;
}else if(result<0){
result=0;
}
}
printf("最大子序列和为:%d",max);
}
//解法三 分治
int getMax4(int a[],int left,int right){
printf("left:%d,right:%d\n",left,right);
if(left==right){
if(a[left]>0){
return a[left];
}else{
return 0;
}
}
int center=(left+right)/2;
int leftNum=getMax4(a,left,center);
int rightNum=getMax4(a,center+1,right);
//开始求解
int result=0;
int lmax=0,rmax=0;
for(int i=center;i>=left;i--){
result+=a[i-1];
if(lmax<result){
lmax=result;
}
}
result=0;
for(int j=center+1;j<=right;j++){
result+=a[j-1];
if(rmax<result){
rmax=result;
}
}
printf("%d,%d,%d,%d,%d\n ",left,right,lmax,rmax,lmax+rmax);
}
//解法二的不同形式
void getMax3(int a[],int len){
int max=0;
for(int i=0;i<len;i++){
int result=0;
for(int j=i;j<len;j++){
result+=a[j];
if(max<result){
max=result;
}
}
}
printf("最大子序列和:%d",max);
}
//解法二O(n^2)
void getMax2(int a[],int len){
int result[len][len];
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
result[i][j]=0;
}
}
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
if(i==0){
result[i][j]=a[j];
}else if(i>0&&(i+j)<len){
result[i][j]=result[i-1][j]+a[j+i];
}
}
}
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
printf("%d ",result[i][j]);
}
printf("\n");
}
}
//求出所有的子序列 O(n^3)
void getMax(int a[],int len){
int *max;
max=(int *)malloc(sizeof(int)*1024);
int num=0;
int i=0;
while(i<len){
for(int j=0;j<len;j++){
int temp=i;
int t=j;
int result=0;
while(temp-->=0&&i+j<len){
printf("%d,%d\n",a[t],t);
result+=a[t++];
}
printf("结果是%d\n",result);
if(result!=0){
*(max+num)=result;
num++;
}
}
i++;
}
int m=max[0];
for(int i=0;i<num;i++){
printf("%d ",max[i]);
if(m<max[i]){
m=max[i];
}
}
printf("\n最大的子序列和为:%d",m);
free(max);
}
int main(){
int test[]={-2,11,-4,13,-5,-2};
getMax5(test,sizeof(test)/sizeof(int));
//getMax4(test,1,sizeof(test)/sizeof(int));
}
最大子序列和问题
最新推荐文章于 2023-07-11 17:28:27 发布