蠻力法:
int maxsum1(int a, int n)}}
return maxsum;
}
分治法:
int maxsum2(int left, int right, int a)
}sum = 0;
right_max = 0;
//求右邊的最大值
for(i = center + 1; i <= right; i++)
}sum = right_max+ left_max;
if(sum < left_sum)
sum = left_sum;
if(sum < right_sum)
sum = right_sum;
}return sum ;
}
動態規劃法:
void maxsum3(int a, int n)
}/* printf("\n\n動態規劃法 列印b陣列:");
for(i = 0; i < n; i++)
printf("\n");
*/ for(j = 0; j < n; j++)
}printf("\n動態規劃法求出最大子段和為:%d", maxsum);
for(i = s-1; i >= 0; i--)
printf("\n\n列印最大子段:\n");
for(i = i + 1; i <= s; i++)
}
完整**:
#include #include #define n 10
//判斷是否全為負數
int isfushu(int a, int n)
if(i == n)
return -1; //全是負數時
else
return 0; //有正數時
}//蠻力法
//從第乙個數開始,找第乙個到最後乙個數間最大欄位和;再從第二個數開始
int maxsum1(int a, int n)}}
return maxsum;
}//分治法
int maxsum2(int left, int right, int a)
}sum = 0;
right_max = 0;
//求右邊的最大值
for(i = center + 1; i <= right; i++)
}sum = right_max+ left_max;
if(sum < left_sum)
sum = left_sum;
if(sum < right_sum)
sum = right_sum;
}return sum ;
}//動態
void maxsum3(int a, int n)
}/* printf("\n\n動態規劃法 列印b陣列:");
for(i = 0; i < n; i++)
printf("\n");
*/ for(j = 0; j < n; j++)
}printf("\n動態規劃法求出最大子段和為:%d", maxsum);
for(i = s-1; i >= 0; i--)
printf("\n\n列印最大子段:\n");
for(i = i + 1; i <= s; i++)
}void print(int a, int n)
}void creat(int a)
}int main()
; int a[n];
creat(a);
print(a, n);
int sum = isfushu(a, n);
if(sum == -1)//全是負數值為0
printf("最大子段和是0");
else
return 0;
}
執行結果:
分治法 動態規劃 最大子段和
題目 給定n個整數 可能為負整數 組成的序列a1,a2,a3,a4,a5,an,求該序列子段和的最大值,子段和 定義為連續 下標遞增 的元素之和。當所有的整數均為負整數時定義其最大子段和為0。如序列為時,最大子段和為20。該問題可以用分治法或者動態規劃來求解。下面給出兩種演算法的思路及 實現 思路 ...
最大子段和問題(分治法和動態規劃)
什麼是最大子段和,通俗點講 最大子段和就是給了一些數,然後你從中找了幾個連續的數,這組連續的數的和比任意一組連續的數的和都大,那麼你找的這幾個連續的數的和就是這些數的最大子段和。通俗的聽不懂你就看這裡 給定由n個整數 可能為負整數 組成的序列 分治法思想 如果將所給的序列a 1 n 分為長度相等的兩...
最大子段和之分治法
問題描述 給定乙個陣列,找出其中可以構成最大數的子段,需要注意的是,這個不同於最大子串行求和 最大字段求和 字段必須是連續的 最大子串行求和 子串行只要是包含在原來的序列中即可 舉個例子 1 4 3 1 5 1 4 5 2 求上述的陣列中的最大欄位和,不難得知,最大子段和就是 10 也就是子段4 3...