POJ2479 POJ1050 最大和子段

POJ2479  Address:http://poj.org/problem?id=2479

POJ1050 Address:http://poj.org/problem?id=1050

 

链接一个地址:http://hi.baidu.com/%B3%E0%BA%AE%D0%F937/blog/item/f326e80293cf4481d53f7c0b.html

 

该说的这篇文章都已经说了,感觉说的很不错。

 

以下贴代码:

 

//2479的思路:从左边开始算出1-j的最大和子段,从右边开始算出n-j的最大和子段,然后搜索一遍求出最大值。

POJ2479:

 

#include <iostream> using namespace std; int main() { int num[50005],left[50005],right[50005]; int n,i,b,max; scanf("%d", &n); while(scanf("%d", &n)!=EOF) { for (i=1; i<=n; i++) scanf("%d", &num[i]); b = 0; max = -10000000; for (i=1; i<=n; i++) { if (b>0) b += num[i]; else b = num[i]; if (b>max) max = b; left[i] = max; } b = 0; max = -10000000; for (i=n; i>=0; i--) { if (b>0) b += num[i]; else b = num[i]; if (b>max) max = b; right[i] = max; } max = -10000000; for (i=1; i<n; i++) { if (left[i]+right[i+1]>max) max=left[i]+right[i+1]; } printf("%d/n", max); } return 0; }

 

//1050的思路:把任意两行之间的每一列对应的元素加起来得到一个数组,求该数组的最大和子段。并求出所有最大和子段的最大值。

POJ1050:

 

#include <iostream> using namespace std; int maxSubArray(int n, int a[]) { int b=0, sum=-10000000, i; for (i=1; i<=n; i++) { if (b>0) b+=a[i]; else b=a[i]; if (b>sum) sum=b; } return sum; } int maxSubMatrix(int n, int array[][105]) { int i,j,k,max=0,sum=-10000000; int b[105]; for (i=1; i<=n; i++) { for (j=1; j<=n; j++) { b[j] = 0; } for (j=i; j<=n; j++) { for (k=1; k<=n; k++) { b[k] += array[j][k]; } max = maxSubArray(n, b); if (max>sum) sum=max; } } return sum; } int main() { int num[105][105]; int n,i,j; while(scanf("%d", &n)!=EOF) { for (i=1; i<=n; i++) { for (j=1; j<=n; j++) { scanf("%d", &num[i][j]); } } printf("%d/n", maxSubMatrix(n, num)); } return 0; }

 

p.s.

最近在做组队训练,结果应该是不太乐观的。明显队友所积累的做题经验以及题量都是太少了。

外面的牛人更是多得数不清。还是继续好好努力吧。

 

你可能感兴趣的:(c)