• 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]);
        }
    }
    
  • 相关阅读:
    php pcntl 多进程学习
    php socket 学习
    linux 常用alias
    php 设置一个函数的最大运行时间
    QTableView 一列添加两个按钮
    翻译qmake文档 目录
    翻译qmake文档(四) Building Common Project Types
    算法时间复杂度
    翻译qmake文档(三) Creating Project Files
    Caliburn.Micro学习笔记目录
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8215816.html
Copyright © 2020-2023  润新知