自己有个服务器 怎样做网站深圳东莞网站开发
news/
2025/9/23 17:40:47/
文章来源:
自己有个服务器 怎样做网站,深圳东莞网站开发,北京网站优化站优化,中国建设银行网站不好用一.问题描述 假如我们有一个数组#xff0c;数组中的元素有正数和负数#xff0c;如何在数组中找到一段连续的子数组#xff0c;使得子数组各个元素之和最大。 二.问题分析
分治法求解#xff1a; 初始状态#xff1a; low0#xff1b;highA.length-1#xff1b;mid数组中的元素有正数和负数如何在数组中找到一段连续的子数组使得子数组各个元素之和最大。 二.问题分析
分治法求解 初始状态 low0highA.length-1midlowhigh/2 求解A的最大子数组A[i,j]有以下三种情况 完全位于A[low,mid]完全位于A[mid1,high]跨越中点 1与2仍为最大子数组问题只是规模更小 对于3任何跨越中点的子数组都由两个子数组组成A[i,mid],A[mid1,j] 只需要找到A[low,mid]和A[mid1,high]的最大子数组然后进行合并即可。 代码实现
#includeiostreamusing namespace std;int find_max_crossing_subarray(int arr[],int low,int high){if(highlow){return arr[low];}int mid(lowhigh)/2;int left-1,right-1,i,sum0,max_left,max_right;for(imid;ilow;i--){sumarr[i];if(sumleft){leftsum;max_lefti;}}sum0;for(imid1;ihigh;i){sumarr[i];if(sumright){rightsum;max_righti;}}return leftright;
}
int max(int a,int b,int c){if(abac){return a;}else if(babc){return b;}else{return c;}
}
int find_max_subarray(int arr[],int low,int high){if(highlow){return arr[low];}int mid(lowhigh)/2;int leftfind_max_subarray(arr, low, mid);int rightfind_max_subarray(arr, mid1, high);int mfind_max_crossing_subarray(arr, low, high);return max(left,right,m);
}int main(){int arr[] {5, 4, -17, 7, 8};coutfind_max_subarray(arr, 0, 4);return 0;
}动态规划求解
对于一个有n个元素的数组arr[n]
记maxSumn为该数组前n个元素和的最大值
pn为前n个元素中以第n元素结尾的最大子数组和
则有 int find_max_subarray_dp(int arr[],int low,int high){if(highlow){return arr[low];}int p[100],maxsum[100];p[0]arr[0];maxsum[0]arr[0];for(int i1;ihigh;i){if(arr[i](arr[i]p[i-1])){p[i]arr[i];}else{p[i]arr[i]p[i-1];}}for(int i1;ihigh;i){if(p[i]maxsum[i-1]){maxsum[i]p[i];}else{maxsum[i]maxsum[i-1];}}return maxsum[high];
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/913345.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!