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 }

转载于:https://www.cnblogs.com/studyfang/p/maxsum.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值