最大子数组
2014-03-29 22:26
211 查看
最近开始看算法导论,看一点就写一点,必须提高自己的编程能力,毕竟要养活我将来的老婆(现在还在当兵的女朋友)。第一次写,都是简单的老掉牙的题目。求谅解。另外算法导论(第三版第38页)有对此题目的另一个解法(分治法),我看着伪代码写了许久,但没运行出来,求诸位大神们指教!好了,废话不多说了。开始看题目。
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。
思路:就是动态规划啦 从数组第一个元素开始逐个加,和如果是负数就舍弃,和(nowsum)为正的话,就将此次的和(nowsum)与前一次算的和(sum)比较,nowsum>sum的话,就将nowsum赋值给sum。从而保证sum是最大子数组的和。
代码如下:
void main (){
int A[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
//全是负数的话就是求最大的一个元素 代码没写
//动态规划做 用分治法没运行出来
int i,j,sum=0;
int nowsum=0;
for(i=0;i<(sizeof(A)/sizeof(int));i++)
{
nowsum+=A[i];
if (nowsum<0) {
nowsum=0;
}
if(sum<nowsum){
sum=nowsum;
}
}
printf("%d\n",sum);
}
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。
思路:就是动态规划啦 从数组第一个元素开始逐个加,和如果是负数就舍弃,和(nowsum)为正的话,就将此次的和(nowsum)与前一次算的和(sum)比较,nowsum>sum的话,就将nowsum赋值给sum。从而保证sum是最大子数组的和。
代码如下:
void main (){
int A[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
//全是负数的话就是求最大的一个元素 代码没写
//动态规划做 用分治法没运行出来
int i,j,sum=0;
int nowsum=0;
for(i=0;i<(sizeof(A)/sizeof(int));i++)
{
nowsum+=A[i];
if (nowsum<0) {
nowsum=0;
}
if(sum<nowsum){
sum=nowsum;
}
}
printf("%d\n",sum);
}
相关文章推荐
- 有矢而发,触类旁通[内核学习的方法论]
- 如何在excel中完成 双纵坐标 柱状图的绘制 (柱子重叠的解决方法)
- Linux命令之dmesg - 查看开机信息/打印或控制内核环形缓冲区
- CSS省略号text-overflow超出溢出显示省略号
- CUDA 编程入门
- A*算法详解
- LR11补丁下载地址
- [硬科技]2014.3.23~2014.3.29
- LR11补丁下载地址
- 学习iOS开发的第17天
- Effective Java 35 Prefer annotations to naming patterns
- CUDA 的 Threading:Block 和 Grid 设定
- Tarjan离线算法求最近公共祖先(LCA)
- Ubuntu 11.04下编译kernel
- java中内部类和异常类
- 多线程引言及多线程存在的意义
- Oracle Data Guard_ 主库删除表空间
- CUDA 的硬件单元映射
- 用Source Insight打开linux内核源代码
- 《逆袭大学》阅读随感