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
相关推荐
岛雨QA7 分钟前
排序算法「Java数据结构与算法学习笔记6」
数据结构·算法
熬夜有啥好11 分钟前
Linux软件编程——综合小练习
linux·算法·目录遍历·fgets·strcpy·linux内核与用户交互·strtok
民乐团扒谱机20 分钟前
【硬核解析】网易云听歌/哼歌识曲底层技术:从算法实现到工程落地(附核心公式/伪代码)
算法
Z9fish22 分钟前
sse哈工大C语言编程练习23
c语言·数据结构·算法
ArturiaZ22 分钟前
【day36】
数据结构·c++·算法
山河君26 分钟前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa
额,不知道写啥。32 分钟前
P5354 [Ynoi Easy Round 2017] 由乃的 OJ
java·开发语言·算法
代码无bug抓狂人33 分钟前
C语言之单词方阵——深搜(很好的深搜例题)
c语言·开发语言·算法·深度优先
im_AMBER1 小时前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
Polaris北1 小时前
第二十九天打卡
算法