日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现最大字段和(动态规划法和分治法)

發布時間:2023/12/31 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现最大字段和(动态规划法和分治法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 一、動態規劃法
  • 二、分治法
  • 三、程序總代碼
  • 總結


前言

本次將對最大字段和使用C語言實現的兩種方法實現,動態規劃法和分治法,兩種方法所反映和表現是不同的想法和做法,但是動態規劃法的時間復雜度更低,那并不是說分治法就不行,相反只是在解答最大字段和的時候沒有動態規劃法來的高效罷了。代碼都比較的好理解,認真看都能看得懂,這里就不解釋了!


一、動態規劃法

int maxsum2(int a[],int left,int right) {int first = left + 1;int total = right - left + 1;int b[100];int sum = 0;b[left] = a[left];int i, j;for (i = first;i <= right;i++){b[i]=(b[i-1] + a[i]) > 0 ? (b[i-1] + a[i]) : a[i];}for (j = left;j <= right;j++){sum = sum > b[j] ? sum : b [j] ;}return sum; }

二、分治法

int maxsum1(int a[], int left, int right) {int leftsum, rightsum, midsum;int mid;int i, j;int temporary1=0, temporary2=0;int sum1=0, sum2=0,sum;if (left == right){sum = a[left];}else {mid = (left + right) / 2;leftsum = maxsum1(a, left, mid);rightsum = maxsum1(a,mid+1,right);for (i = mid;i >= left;i--){sum1 += a[i];temporary1 = sum1 > temporary1 ? sum1:temporary1;}for (j = mid + 1;j <= right;j++){sum2 += a[j];temporary2 = sum2 > temporary2 ? sum2 : temporary2;}midsum = temporary1 + temporary2;if (leftsum > rightsum ){sum = leftsum;}else {sum = rightsum;}if (sum < midsum){sum = midsum;}}return sum; }

三、程序總代碼

#include<stdio.h> int maxsum1(int a[], int left, int right); //分治法求最大字段和 int maxsum2(int a[], int left, int right); //動態規劃法求最大字段和 int main() {int a[10];int max;for (int i = 0;i < 10;i++){scanf("%d", &a[i]);}for (int j = 0;j < 10;j++){printf("%d ", a[j]);}//max=maxsum1(a, 0, 9);max = maxsum2(a,0,9);printf("\n%d", max);return 0; } int maxsum1(int a[], int left, int right) {int leftsum, rightsum, midsum;int mid;int i, j;int temporary1=0, temporary2=0;int sum1=0, sum2=0,sum;if (left == right){sum = a[left];}else {mid = (left + right) / 2;leftsum = maxsum1(a, left, mid);rightsum = maxsum1(a,mid+1,right);for (i = mid;i >= left;i--){sum1 += a[i];temporary1 = sum1 > temporary1 ? sum1:temporary1;}for (j = mid + 1;j <= right;j++){sum2 += a[j];temporary2 = sum2 > temporary2 ? sum2 : temporary2;}midsum = temporary1 + temporary2;if (leftsum > rightsum ){sum = leftsum;}else {sum = rightsum;}if (sum < midsum){sum = midsum;}}return sum; }int maxsum2(int a[],int left,int right) {int first = left + 1;int total = right - left + 1;int b[100];int sum = 0;b[left] = a[left];int i, j;for (i = first;i <= right;i++){b[i]=(b[i-1] + a[i]) > 0 ? (b[i-1] + a[i]) : a[i];}for (j = left;j <= right;j++){sum = sum > b[j] ? sum : b [j] ;}return sum; }

總結

記錄自己的學習!

總結

以上是生活随笔為你收集整理的C语言实现最大字段和(动态规划法和分治法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。