acm pku 2479解题报告

这是一个动态规划的题目。可以使用双DP。输入的时候可以使用一次DP。求出最大值。然后从后往前进行一次DP求出最大值就可以了。时间复杂度为O(N)。
具体代码实现如下:
  1. #include<iostream>
  2. using namespace std;
  3. int temp[50000],num[50000];
  4. const int MIN = -100000;
  5. int main()
  6. {
  7.     int test,n;
  8.     int tmp,ans,sum;
  9.     scanf("%d",&test);
  10.     while(test--)
  11.     {
  12.         scanf("%d",&n);
  13.         tmp = MIN;
  14.         sum = 0;
  15.         for(int i=1;i<=n;i++)//第一次DP 
  16.         {
  17.             scanf("%d",&num[i]);
  18.             sum += num[i];
  19.             if(sum>tmp)
  20.                 tmp = sum;
  21.             temp[i] = tmp;
  22.             if(sum<0) sum = 0;
  23.         }
  24.         tmp = ans = MIN;
  25.         sum = 0;
  26.         for(int i=n;i>1;i--)//第二次DP 
  27.         {
  28.             sum += num[i];
  29.             if(sum>tmp) tmp = sum;
  30.             if(ans<(temp[i-1]+tmp))
  31.                 ans = temp[i-1]+tmp;
  32.             if(sum<0) sum = 0;
  33.         }
  34.         cout << ans << endl;
  35.     }
  36.     return 0;
  37. }
  38.         
  39.         
  40.         

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值