Gym 100733DLittle thief Shi

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym 100733DLittle thief Shi相关的知识,希望对你有一定的参考价值。

Shi realized that he was almost out of money, even renting Shitalian lands. Shi was walking on a street, while thinking of a way to recover his fortune. In his way, he passed by a jewelry store. The owner of the store was a Shitalian man suspected of committing minor crimes, as cutting bushes and stealing old bread. Shi hated people who cut bushes, so he decided to rob the store to take revenge and make some money.

The store has n jewels, put in a row, one after another. Each jewel i can be sold in the black market for a value vi. Shi wants to steal as much as possible, but if he steals everything, the owner will notice, so if Shi steals the i-th jewel, he can‘t steal the i - 1-th, i - 2-th, i + 1-th and i + 2-th jewels.

Using the best strategy possible, calculate the sum of the jewels values that Shi can obtain.

Input

The input begins with an integer n (1 ≤ n ≤ 106), indicating the number of jewels in the store. The next line containsn integers. The i-th integer vi (1 ≤ vi ≤ 103) is the value of the i-th jewel.

Output

Output the maximum value that Shi can get.

Sample test(s)
input
4
1 2 3 4
output
5
input
6
1 2 4 0 3 0
output
5
input
7
2 10 12 24 29 69 0
output
81
input
10
15 1 6 3 7 100 9 15 80 95
output
210

题意:n个数字,每次最少隔两个取一个,求取得数的最大和

分析:dp,想法一、s[i]表示取第i个时最大和为多少,那就取不了i-1、i-2,可以取i-3、i-4、i-5,.....,当取i-6时,可取i-3,显然取了更划算,同理,i-7、i-8在算s[i-4]、s[i-5]时考虑过了,s[i]=a[i]+max{s[i-3],s[i-4],s[i-5]}

#include<stdio.h>
#include<algorithm>
using namespace std;
int n,s[1000025],tem,ans=0;
int main(){
    scanf("%d",&n);
    for(int i=5;i<n+5;i++)
    {
         scanf("%d",&tem);
         s[i]=max(s[i-3],max(s[i-4],s[i-5]))+tem;
         ans=max(ans,s[i]);
    }
    printf("%d",ans);
    return 0;
}

想法二、s[i]表示前i个的最大和为多少,s[i]=max{s[i-1],s[i-3]+第i个}

#include<stdio.h>
#include<algorithm>
using namespace std;
int n,s[1000005],tem;
int main(){
    scanf("%d",&n);
    for(int i=3;i<n+3;i++)
        scanf("%d",&tem),s[i]=max(s[i-1],tem+s[i-3]);
    printf("%d",s[n+2]);
    return 0;
}

  

以上是关于Gym 100733DLittle thief Shi的主要内容,如果未能解决你的问题,请参考以下文章

2015 USP-ICMC gym 100733 I. The Cool Monkeys

Gym - 101002H: Jewel Thief (背包,分组,DP决策单调性)

Gym 100733J Summer Wars 题解:灵活运用扫描线的思想

跨域共享策略 - 在 Chrome 上使用 color-thief.js 加载颜色

CodeForces 632E Thief in a Shop

Gym 100247CVictor's Research(有多少区间之和为S)