HDOJ 1003
动态规划题,转移方程:C[i]=max{C[i-1]+A[i], A[i]} i=1,2,...,n C[0] = 0
OPT(A) = max{C[i]}, i=1,2,...,n。
最大的整数可以通过先将-1转成无符号整数,然后逻辑右移得到。
需要注意几组特殊的数据:0 0 -1 0; -1 -2 -3; 1 2 3 -7 1 2 3。
1 #include <stdio.h> 2 3 #define MAX_INT ((unsigned long)(-1)>> 1) 4 #define MIN_INT (MAX_INT+1) 5 6 int a[100000]; //store the number in array 7 int main() 8 { 9 #ifdef LOCAL 10 freopen("data.in","r",stdin); 11 freopen("data.out","w",stdout); 12 #endif 13 int cases,tempL; 14 int num,i,j; 15 int start, end; 16 long int previousSum,sum; 17 18 scanf("%d", &cases); 19 20 for(i=0; i<cases; ++i) { 21 scanf("%d", &num); 22 for(j=0; j<num; ++j) 23 scanf("%d",&a[j]); 24 25 sum = MIN_INT; 26 previousSum = 0; 27 tempL = 0; 28 for(j=0; j<num; ++j) { 29 if (previousSum >= 0 ) 30 previousSum += a[j]; 31 else { 32 previousSum = a[j]; 33 tempL = j; 34 } 35 if (previousSum > sum) { 36 sum = previousSum; 37 start = tempL; 38 end = j; 39 } 40 41 } 42 43 printf("Case %d:\n",i+1); 44 printf("%ld %d %d\n",sum,start+1,end+1); 45 if (i<cases-1) 46 printf("\n"); 47 } 48 return 0; 49 }