zoukankan      html  css  js  c++  java
  • 2016级算法期末上机-D.简单·AlvinZH's Fight with DDLs I

    1117 AlvinZH's Fight with DDLs I

    思路

    简单题,动态规划。

    本题与期末练习赛B题很相似,而且更为简单些。简化问题:在数字序列上取数,不能取相邻的数。

    DP数组定义,dp[i]:到达第i层所能取得的最大经验值。初始化:dp[0] = x[0], dp[1] = max(x[0], x[1])。

    对于第 (i) 层,有两种选择:不打,等于 (dp[i-1]);打,等于 (dp[i-2] + x[i])。二者取最大值即可。

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

    分析

    时间复杂度:O(n)。

    空间复杂度:O(n)。

    优化:在dp求解过程中,发现只用到了dp[i-1]与dp[i-2]的值,可以使用三个变量实现dp过程。

    参考代码

    /* 
     Author: 朱辉(35)
     Result: AC	Submission_id: 514878
     Created at: Mon Dec 25 2017 21:09:06 GMT+0800 (CST)
     Problem: 1117	Time: 29	Memory: 3868
    */
    
    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int n;
    int x[100005];
    long long dp[100005];
    
    int main()
    {
        while(~scanf("%d", &n))
        {
            for (int i = 0; i < n; ++i)
                scanf("%d", &x[i]);
    
            if(n == 1)
            {
                printf("%d
    ", x[0]);
                continue;
            }
    
            dp[0] = x[0];
            dp[1] = max(x[0], x[1]);
            for (int i = 2; i < n; ++i)
                dp[i] = max(dp[i-1], dp[i-2]+x[i]);
    
            printf("%lld
    ", dp[n-1]);
        }
    }
    
  • 相关阅读:
    希腊字母写法
    The ASP.NET MVC request processing line
    lambda aggregation
    UVA 10763 Foreign Exchange
    UVA 10624 Super Number
    UVA 10041 Vito's Family
    UVA 10340 All in All
    UVA 10026 Shoemaker's Problem
    HDU 3683 Gomoku
    UVA 11210 Chinese Mahjong
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8215816.html
Copyright © 2011-2022 走看看