1)先写我的 github 的介绍:
github 的域名:http://www.github.com/jeanhwea
登入 github 大概是下面的视图:
2)我选择的教材: code complete2
最大子数组之和
这个问题想明白了大致还是比较简单的,我想的是一个O(n) 的算法,大致思路就是,首先将前面的元素相加,并把和记为b,如果该和小于0,那么就把前面的相加之和丢弃掉,从新从下一个元素相加,(明显,如果前面的元素之和小于0,那么最大的子数组之和不应该包含这些元素,因为它们对子数组之和有不利的影响)
每次扫描过一个元素,就把当前的子数组之和和一个当前保存的值做比较,(这个值可以初始化为0),如果当前数组之和大于这个保存值,那么就把这个当前数组之和的值保存下来,这样,扫描过一遍数组之后,就得到了当前数组的最大子数组之和的值。
int maxSum(int* a, int n) { int sum=0; int b=0; int i=0; for(i=0; i<n; i++) { if(b<0) //... b=a[i]; else b+=a[i]; if(sum<b) sum=b; } return sum; }
把所求的数组放入这个函数中,并输入数组的长度你n,就可以返回数组的最大长度。
需要注意的一点是,这个算法对于数组元素全是负数的情况之下会返回0,也可以扫描整个数组,返回最大的负数,但是返回0,就意味着子数组选择了0个,也是合理的
主函数
int main(int argc, char* argv[]) { FILE *in; int i=0,j=0,k=0,z=0,t=0,temp[200]={0}; int n,m,d[200][200],sum=0,s=0; int test[10]={1,2,3,-1,2,3,1}; char path[50]; j=strlen(argv[0]); for(;j>=0;j--) { if((int)argv[0][j]==92) break; } for(i=0;i<=j;i++) path[i]=argv[0][i]; path[i]='