算法——动态规划

一、

53. 最大子数组和 - 力扣(LeetCode)

算法——动态规划_第1张图片

最大子数组和,可以建立一个dp表,来存放当前的位置的累加的最大和

算法——动态规划_第2张图片

int maxSubArray(vector& nums) {
        int n=nums.size();
        if(n==1)
            return nums[0];
        vector dp(n);
        int sum=0;
        if(nums[0]>0)
            dp[0]=nums[0];//大于0就直接放入
        else
            dp[0]=0;//小于0就放入0
        for(int i=1;i0)
                dp[i]=sum;
            else 
                dp[i]=0;
        }
        sort(dp.begin(),dp.end());
        if(dp[n-1]<=0)
        {
            sort(nums.begin(),nums.end());
            return nums[n-1];
        }
        return dp[n-1];
    }

二、

918. 环形子数组的最大和 - 力扣(LeetCode)

算法——动态规划_第3张图片

算法——动态规划_第4张图片

这样就是将求数组的连续最大值转换为求数组的最小值

那么我们就需要建立两个表,一个是f表,用来存最大值的,一个是g表,用来存最小值的。

算法——动态规划_第5张图片

算法——动态规划_第6张图片

int maxSubarraySumCircular(vector& nums) {
        int n=nums.size();
        vector f(n+1),g(n+1);//定n+1 是为了防止i-1的时候越界
        int fmax=INT_MIN,  gmin=INT_MAX, sum=0;
        for(int i=1;i<=n;i++)
        {
            int x=nums[i-1];
            f[i]=max(x,x+f[i-1]);
            fmax=max(fmax,f[i]);//实时读取最大值
            g[i]=min(x,x+g[i-1]);
            gmin=min(gmin,g[i]);
            sum+=x;
        }
        return sum==gmin?fmax:max(fmax,sum-gmin);//如果sum==gmin说明数组里全是负数
    }

三、

152. 乘积最大子数组 - 力扣(LeetCode)

算法——动态规划_第7张图片

算法——动态规划_第8张图片

算法——动态规划_第9张图片

算法——动态规划_第10张图片

 int maxProduct(vector& nums) {
       int len=nums.size();
       vector pos(len);
       auto nag=pos;
       nag[0]=nums[0],pos[0]=nums[0];
        for(int i=1;i

309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode)

算法——动态规划_第11张图片

class Solution {
public:
    int maxProfit(vector& prices) {
        int n=prices.size();
        vector> dp(n,vector(3));//构建二维数组,恰好进行了一次分类
        //dp表存放的是当前状态下的最大值
        //买入               可交易        冷冻期
        dp[0][0]=-prices[0],dp[0][1]=0,dp[0][2]=0;
        for(int i=1;i

714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)

算法——动态规划_第12张图片

class Solution {
public:
    int maxProfit(vector& p, int fee) {
        //要画图,便于看出状态方程

        int n=p.size();//获取个数
        vector> dp(n,vector(2));
        //第一列代表买入所能获得的最大利润,第二列代表卖出所能获得的最大利润
        dp[0][0]=-p[0],dp[0][1]=0;
        for(int i=1;i

123. 买卖股票的最佳时机 III - 力扣(LeetCode)

算法——动态规划_第13张图片

你可能感兴趣的:(动态规划,算法)