2023-08-18力扣每日一题

链接:

1388. 3n 块披萨

题意:

一个长度3n的环,选n次数字,每次选完以后相邻的数字会消失,求选取结果最大值

解:

这波是~~(ctrl)CV工程师了~~

核心思想是选取n个不相邻 的元素一定合法,我推不出来,猜一猜倒是可以O.o

DP[i][j]表示从[0,i]中选取j个数字的最大值

初始条件,我们可以确定,如果选择0个数字j==0则结果为0;如果j<i+1,,则要在不足的数字中进行选取,我们设为0(官方是设为INT_MIN,我写了0好像也没事,可能是数据弱了?);由于思想中只对相邻数字做判断,所以我们提供[0,0]和[0,1]选取1个数字的值作为DP的初始条件之一,即dp[0][1]=temp[0] 和 dp[1][1]=max(temp[0],temp[1])

剩下的就很简单了,状态转移就是从小的范围推导出大的范围,少的选取推导出多的选取,每个DP[I][J]只需要判断I选不选就行

特别注意的是,由于整体成环状,所以分别对去掉头和去掉尾进行一次DP(因为只考虑相邻)

只要能推出取n个不相邻的数字就能满足题意就很好写了

实际代码:

c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
int solve(vector<int>& temp)
{
    int num=temp.size(),need=(num+1)/3;
    vector<vector<int>>dp(num,vector<int>(need+1,0));
    dp[0][1]=temp[0];
    dp[1][1]=max(temp[0],temp[1]);
    
    for(int i=2;i<num;i++)
    {
        for(int j=1;j<=need;j++)
        {
            dp[i][j] = max(dp[i - 1][j],dp[i - 2][j - 1]+temp[i]);
        }
    }
    return dp[num-1][need];
}
int maxSizeSlices(vector<int>& slices)
{
    int lg=slices.size();
    vector<int> v1(slices.begin() + 1, slices.end());
    vector<int> v2(slices.begin(), slices.end() - 1);
    
    return max(solve(v1),solve(v2));
}
int main()
{
    vector<int> slices;int slice;
    while(cin>>slice) slices.push_back(slice);
    int ans=maxSizeSlices(slices);
    cout<<ans<<endl;
    return 0;
}

限制:

  • 1 <= slices.length <= 500
  • slices.length % 3 == 0
  • 1 <= slices[i] <= 1000
相关推荐
GISer_Jing9 分钟前
React中 Reconciliation算法详解
前端·算法·react.js
自律的kkk25 分钟前
洛谷:P1540 [NOIP2010 提高组] 机器翻译
人工智能·算法·自然语言处理·机器翻译
勤劳的进取家2 小时前
如何构建多层决策树
人工智能·算法·机器学习
武昌库里写JAVA2 小时前
Redis 笔记(二)-Redis 安装及测试
数据结构·vue.js·spring boot·算法·课程设计
m0_694938013 小时前
Leetcode打卡:不含特殊楼层的最大连续楼层数
算法·leetcode·职场和发展
DogDaoDao3 小时前
leetcode 面试经典 150 题:字母异位词分组
算法·leetcode·面试·vector·哈希表·数据结构与算法·字母异位词分组
tt5555555555553 小时前
每日一题-两个链表的第一个公共结点
数据结构·算法·链表
jiayoushijie-泽宣3 小时前
VITA-1.5接近GPT4o水平的多模态模型:理解和跑通这套多模态实时交互系统
人工智能·算法·交互
Smark.3 小时前
(leetcode算法题)769. 最多能完成排序的块
算法·leetcode
Gpluso_od3 小时前
LeetCode -Hot100 - 73. 矩阵置零
算法·leetcode·矩阵