zoukankan      html  css  js  c++  java
  • 2016级算法期末模拟练习赛-B.AlvinZH的青春记忆I

    1083 AlvinZH的青春记忆I

    思路

    中等题,动态规划。

    简化题意,一个环上取数,数不可相邻,取取得数之和最大值。

    环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者。

    ①:取第一个点,可取得最大价值为宝物[1,n-1]的最大价值。

    ②:不取第一个点,可取得最大价值为宝物[2,n]的最大价值。

    动态规划,状态转移方程:(dp[i] = max(dp[i-1], dp[i - 2] + V[i]))

    分析

    时间复杂度:(O(n))

    参考代码

    //
    // Created by AlvinZH on 2017/12/4.
    // Copyright (c) AlvinZH. All rights reserved.
    //
    
    #include <cstdio>
    #include <iostream>
    #define max(a, b) a > b ? a : b
    using namespace std;
    
    int n;
    int V[100005];
    
    /*
    int dp[100005];
    int maxValue(int left, int right)
    {
        dp[left] = V[left];
        dp[left+1] = max(V[left], V[left+1]);
    
        for(int i = left+2; i <= right; i++)
            dp[i] = max(dp[i-1], dp[i - 2] + V[i]);
    
        return dp[right];
    }
    */
    //优化代码
    int maxValue(int left, int right)
    {
        int LastTwo = 0, LastOne = 0;
    
        for(int i = left; i <= right; i++)
        {
            int temp = LastOne;
            LastOne = max(LastOne, LastTwo + V[i]);
            LastTwo = temp;
        }
    
        return LastOne;
    }
    
    int main()
    {
        while(~scanf("%d", &n))
        {
            for(int i = 1; i <= n; i++)
                scanf("%d", &V[i]);
    
            if(n == 1) printf("%d
    ", V[1]);
            else printf("%d
    ", max(maxValue(1, n-1), maxValue(2, n)));
        }
    }
    
  • 相关阅读:
    [DDCTF 2019]homebrew event loop
    [极客大挑战 2019]FinalSQL
    $[HAOI2008]$硬币购物
    $2018/8/19 = Day5$学习笔记 + 杂题整理
    $2018/8/16 = Day2$学习笔记$+$杂题整理
    [NOIp2009] $Hankson$の趣味题
    2018清北学堂夏日培训游记
    2.数组的声明和创建
    1.什么是数组?
    15.递归
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8137717.html
Copyright © 2011-2022 走看看