发现malloc动态内存分配很耗内存!
做这题时我用malloc耗费了4224K,而换成固定大小的数组时缩小到了988K!
删除#include <stdlib.h>之前耗时188MS,删除之后耗时219MS:)
经过数次WA,终于AC了,在此简述下思想。
这是一道典型的DP,先从左至右进行一次DP,把max值(即此元素之前的最大子数组和)存放在一个数组maxBef中,这样数组中的每个元素就对应一个max值,此max值代表此元素之前(包括此元素)的最大子数组和。
然后再从右至左进行一次DP,每次循环求max与maxBef[i-1]相加的和,循环结束得到max+maxBef[i-1]的最大值,这个值就是答案:)
这样的程序为O(n)。之前想过一个方法,用一个循环,以每一个元素为界限,再分别对界限两边的元素DP,这样也没错,不过O(n*n),超时了:(
后来又经历了一段WA,原因是没有仔细注意到循环的界限,看来以后还是要仔细。
以下是代码:
做这题时我用malloc耗费了4224K,而换成固定大小的数组时缩小到了988K!
删除#include <stdlib.h>之前耗时188MS,删除之后耗时219MS:)
经过数次WA,终于AC了,在此简述下思想。
这是一道典型的DP,先从左至右进行一次DP,把max值(即此元素之前的最大子数组和)存放在一个数组maxBef中,这样数组中的每个元素就对应一个max值,此max值代表此元素之前(包括此元素)的最大子数组和。
然后再从右至左进行一次DP,每次循环求max与maxBef[i-1]相加的和,循环结束得到max+maxBef[i-1]的最大值,这个值就是答案:)
这样的程序为O(n)。之前想过一个方法,用一个循环,以每一个元素为界限,再分别对界限两边的元素DP,这样也没错,不过O(n*n),超时了:(
后来又经历了一段WA,原因是没有仔细注意到循环的界限,看来以后还是要仔细。
以下是代码:
- #include <stdio.h>
- #include <stdlib.h>
- main(int argc, char *argv[])
- {
- //int *d, *maxBef;
- int d[100000], maxBef[100000];
- long sum, max, n, i, maxSum;
- freopen("POJ2593.TXT","r",stdin);
- while (scanf("%d", &n) && n!=0){
- //d=(int *)malloc(n*sizeof(int));
- //maxBef=(int *)malloc(n*sizeof(int));
- for (i=0; i<n; i++)
- scanf("%d", &d[i]);
- for (i=1, sum=max=d[0]; i<n; i++){//从左向右的一次DP,将每个数字之前的最大子数组之和存入到数组maxBef当中
- if (sum>0)
- sum+=d[i];
- else
- sum=d[i];
- if (max<sum)
- max=sum;
- maxBef[i]=max;
- }
- maxBef[0]=d[0];
- maxSum=(n>1) ? maxBef[n-2]+d[n-1] : d[0];//初始化maxSum
- for (i=n-2, sum=max=d[n-1]; i>0; i--){//从右向左的一次DP,将所得的max与maxBef相加
- if (sum>0)
- sum+=d[i];
- else
- sum=d[i];
- if (max<sum)
- max=sum;
- if ((max+maxBef[i-1])>maxSum)
- maxSum=max+maxBef[i-1];
- }
- printf("%d/n", maxSum);
- }
- //free(d);
- //free(maxBef);
- }
DP算法优化与实践
本文通过一道典型的最大子数组和问题,介绍了如何使用两次DP算法优化解决方案,从左至右和从右至左扫描数组来获取最大子数组和,同时对比了使用动态内存分配与固定数组对内存和时间的影响。
544

被折叠的 条评论
为什么被折叠?



