zoukankan      html  css  js  c++  java
  • 【Gym 100733D】Little thief Shi(取数,DP)

    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;
    }

    想法二、也是dp,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;
    }

      

  • 相关阅读:
    如何通过js在子页面调用父页面元素的click事件
    时间戳转换成时间格式
    sql 生成某个范围内的随机数
    Ioc思想
    【Sharepoint控件】MOSS模式化窗口
    【Sharepoint代码段】MOSS模拟超级管理员的方法
    【Sharepoint对象模型】MOSS根据模板添加子网站
    【Sharepoint控件】MOSS列表添加时SPUser字段赋值
    【C#代码段】asp在数据库加入数据
    【C#代码段】ajax从asp后台获取数据
  • 原文地址:https://www.cnblogs.com/flipped/p/5183142.html
Copyright © 2011-2022 走看看