编程珠玑上的题:
/* * 找出任何相邻子向量的最大和 * xtfggef 2012/5/7 */ #include<stdio.h> int max(int a,int b) { return (a>b)?a:b; } void main() { int a[10] = {31,-41,59,26,-53,58,97,-93,-23,84}; int maxsofar = 0; int maxendinghere = 0; for(int i=0; i<10; i++) { //遇到负数,直接赋0,相当于跳过 //遇到大一点的数,从该数开始 maxendinghere=max(maxendinghere+a[i],0); maxsofar=max(maxsofar,maxendinghere); } printf("%d\n",maxsofar); }
仔细研究了下,好精妙的算法啊!建议读者走一遍程序,观察变化,体会细节!