7/31-8/2 动态规划——基本理论复习&除数博弈&连续子数组的最大和

最近学习效率太太太太低了

动态规划的概念

最优化原理(分布式求解):

在实际生活中,有一类问题的活动过程可以分成若干个阶段,且在任一阶段后的行为依赖于该阶段的状态,与该阶段之前的过程如何达到这种状态的方式无关。

  1. 这类问题解决的是多阶段的决策过程
  2. 是处理分段过程最优化问题的一类非常有效的方法

多阶段过程的最优决策序列应当具有的性质
  1. 无论过程的初始状态和决策是什么,其余的决策都必须相对于初始决策所产生的状态构成一个最优决策序列。
  2. 最优子结构性质

原问题最优解包含了其子问题的最优解,即原问题可以由子问题的最优解组合而成,使得问题可以拆分成若干个子问题。

  1. 重叠子问题性质

每次产生的子问题并不总是新问题,有些子问题被反复计算多次。(与分治法的区别,分治法求解时,有些子问题被重复计算多次,时间复杂度呈指数增长;这里的子问题往往不是相互独立的,不同子问题的数目常常只有多项式量级,如果能保存已解决问题的答案,在需要时再找出来,就能避免大量重复计算,得到多项式时间算法。)

设计动态规划算法的步骤
  1. 找出最优解的性质,并刻画其结构特征
  2. 递归地定义最优值
  3. 自底向上的方式计算出最优解
  4. 根据计算最优解时得到的信息,构造最优解

除数博弈

如题:在这里插入图片描述
重点:玩家都以最佳状态参与游戏

//要求:N能整除x 
//选1-N之间的N的因数   

//因为奇数的因子只会等于奇数,N-x一定是偶数
//只要得到偶数的时候-1,对面就又会是奇数
//最后自己一定会得到最小偶数2,就获胜了

class Solution {
public:
    bool divisorGame(int N) {
        return !(N&1);
    }
};

在这里插入图片描述


连续子数组的最大和

在这里插入图片描述

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum=nums[0],pre=0;
        for(const auto &x: nums){
            pre=max(x,pre+x);
            sum=max(sum,pre);
        }
        return sum;       
    }
};

求每一个位置的数结尾的最大子段和,它等于其自身、或者是其上一个数结尾的最大子段和加上它。


C++ vector容器

vector用于实现数组的功能,等于在数组的基础上,封装了一些常用的功能,因为数组的长度是不变的,为了更方便使用,就写了这样一个类模板。
STL标准模板库里,对vector提供了一些成员函数。

  1. 重载操作符[ ]返回容器中某一个元素,参考两个版本:const和非const
  2. 函数frond( )he back( )返回第一个和最后一个元素
  3. 函数insert( ) 在一个给定的位置插入一个新的元素
  4. 功能push_back( )和pop_back( ) 在尾部添加或删除最后一个元素
  5. at 按索引访问某个位置的元素
    ······

vector和普通的数组一样,具有一个容量的概念。可以推断,vector内部是有一个缓冲区来存储元素的。其在内容上还是数组,只是在外在形式上比数组更易于使用,原因是其对外封装了接口函数,便于操纵。
要注意的是,用vector也不适合在中间指定位置插入、删除元素,需要大规模的数据移动,效率低,在程序中要尽量少对vector进行insert/erase。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值