POJ 2479 Maximum sum【求两个不重叠的连续子串的最大和】


POJ 2479 Maximum sum
算法核心:dp
对于n个连续数字,在其中任意取出两个不重叠的连续段,求所有合法条件下该两个连续段和的最大值
例如:
  n = 10,数字为:1 -1 2 2 3 -3 4 -4 5 -5
  此时答案为13 ,即(2,2,3,-3,4)与(5)的和

#include < stdio.h >
const int N = 50000 + 1 ;
int dp1[ 2 ]; // dp[i]记录包含数字i的前i个数字的一段最大和
int dp2[ 2 ]; // dp2[i]记录前i个数字的一段最大和
int dp3[ 2 ]; // dp3[i]记录到包含数字i的两段最大和
inline int max( int a, int b)
{
return a > b ? a:b;
}
int main()
{
int T;
while (scanf( " %d " , & T) != EOF)
{
while (T -- )
{
int n,i,a;
scanf(
" %d " , & n);
scanf(
" %d " , & a);
dp1[
0 ] = a;
dp2[
0 ] = a
scanf( " %d " , & a);
dp1[
1 ] = max(dp1[ 0 ] + a,a);
dp2[
1 ] = max(dp1[ 1 ],dp2[ 0 ]);
dp3[
1 ] = dp1[ 0 ] + a;

int pre = 0 ;
int cur = 1 ;
int ans = dp3[ 1 ];
for (i = 2 ;i < n;i ++ )
{
cur
= pre;
pre
= 1 - pre;
scanf(
" %d " , & a);
dp1[cur]
= max(dp1[pre] + a,a);
dp2[cur]
= max(dp2[pre],dp1[cur]);
dp3[cur]
= max(dp3[pre] + a,dp2[pre] + a);
ans
= max(dp3[cur],ans);
}

printf(
" %d\n " ,ans);
}
}

return 0 ;
}

转载于:https://www.cnblogs.com/AndreMouche/archive/2011/02/12/1952498.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值