spoj 11404 Save Thy Toys

DCEPC501 - Save Thy Toys


Leonard is very fond of buying rare and expensive science fiction toys. He keeps his collection in a sequential order of the date on which the toy was bought in a special closet so that his roomie Sheldon never gets hold of his toys. But because of his bad luck Leonard once loses a bet to Sheldon and Sheldon demands a share Leonard’s toys. Since Leonard doesn’t want to loose much money, he decides upon a strategy to reduce his loss to minimum.

Leonard, beginning from the first toy in his closet will pick some toys, say "x" toys in sequence. Sheldon will then pick the next "x" toys (Note that Sheldon picks equal no. of toys as picked by Leonard in his move unless the remaining toys are less than "x". In that case he picks all of the remaining). This will keep going on till no more toys are left in the closet for Leonard to pick. You are given the sequence of toys with their price. Help Leonard in maximizing the total price of all toys he picks.

Leonard in his each turn can either pick only 1 or 2 or 3 toys ("x" described above can take value either 1, 2 or 3).

Input

First line specifies T, the number of test cases.

Each test case contains N in the first line. Second line contains N integers as described above.

Output

Output 1 line for each test case giving the maximum possible value of the total sum of all toys Leonard picks.

Constraints

1<=T<=10

1<=N<=100000

1<=Price of toys<=1000000

Example

Input:
2
4
5 4 3 2
6
10 8 7 11 15 20

Output:
12
53



Explanation:

In 1st case, Leonard picks 3 toys in his first move with value 5,4,3 and Sheldon has no choice but to pick the last.
In 2nd case, Leonard picks 10, 8. Then Sheldon picks 7,11. And then Leonard picks the rest.

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
long long dp[MAXN];
long long a[MAXN];
int main()
{
    long long t;
    scanf("%lld",&t);
    while(t--)
    {
        long long n;
        scanf("%lld",&n);
        for(long long i=1;i<=n;i++)
            scanf("%d",&a[i]);
        a[n+1]=0;a[n+2]=0;a[n+3]=0;
        memset(dp,0,sizeof(dp));
        for(long long i=2;i<=n+3;i+=2)
        {
            for(long long j=1;j<=3&&i>=2*j;j++)
            {
                long long mid=0;
                for(long long k=1;k<=j;k++)
                {
                    mid+=a[i-2*j+k];
                }
                dp[i]=max(dp[i],dp[i-2*j]+mid);
            }
        }
        long long ans=dp[n];
        ans=max(ans,dp[n+1]);
        ans=max(ans,dp[n+2]);
        ans=max(ans,dp[n+3]);
        printf("%lld\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值