牛客小白月赛60 C 小竹关禁闭(动态规划 01背包)

题目描述

妈妈成功将小竹救了出来,她觉得小竹实在是太笨了,决定关小竹一周禁闭。可是小竹哪里能忍受失去自由,他早就偷藏了一部手机用于联系你,请求你帮助他逃离。

你通过观察发现他房间内有 n n n 个可用于制成绳子的物品,第 i i i 个的长度为 a i a_i ai 。当你使用第 i i i 个物品制作绳子时,其右侧的 k k k 个物品(不含第 i i i个物品)就无法再被用于制作绳子 。最终,小竹用选择的物品制成绳子,绳子的长度是所选择物品的长度之和。

小竹想知道,他能制作的绳子长度最长为多少?

输入描述:

第一行两个整数 n , k ( 1 ≤ k ≤ n ≤ 2000 ) n,k(1≤k≤n≤2000) n,k(1≤k≤n≤2000)。

第二行 n n n 个用空格隔开的整数,第 i i i 个整数为 ( 1 ≤ a i ≤ 2000 ) (1≤a_i ≤2000) (1≤ai≤2000),表示第 i i i 个物品的长度。

输出描述:

一行一个整数,表示绳子的最长长度。

输入

复制代码
5 2
1 2 3 4 5

输出

复制代码
7

说明

使用第 2 2 2 个和第 5 5 5 个物品制成绳子


赛时压根没看出来是一个dp问题。

对于此问题,使用 f [ i ] f[i] f[i]来代表从前 i i i个里面选,这时候需要先分为两种情况,第一种情况是第 i i i个物品前面有 k k k个物品,也就是 i − k − 1 > = 0 i-k-1 >= 0 i−k−1>=0,这时候我们就可以把集合划分为选第 i i i个还是不选第 i i i个,如果选第 i i i个,就是 f [ i − k − 1 ] + a [ i ] f[i-k-1] + a[i] f[i−k−1]+a[i],如果不选第 i i i个,就是 f [ i − 1 ] f[i-1] f[i−1],第二种情况是前 i i i个物品不够 k k k个物品,这时如果选第 i i i个,就是 a [ i ] a[i] a[i] ,如果不选第 i i i个,就是 f [ i − 1 ] f[i-1] f[i−1]。

代码:

cpp 复制代码
#include<iostream>
using namespace std;
const int N = 2010;
int f[N];
int a[N];
int n,k;
int main(){
    cin >> n >> k;
    for(int i = 1;i <= n;i++)cin >> a[i];
    
    int res = 0;
    for(int i = 1;i <= n;i++){
        if(i-k-1 >= 0)f[i] = max(f[i-1],f[i-k-1]+a[i]);
        else f[i] = max(a[i],f[i-1]);
        res = max(f[i],res);
    }
    cout << res;
    return 0;
}
相关推荐
哪 吒3 小时前
【2025C卷】华为OD机试九日集训第3期 - 按算法分类,由易到难,提升编程能力和解题技巧
python·算法·华为od·华为od机试·2025c卷
机器学习之心HML3 小时前
PSO-TCN-BiLSTM-MATT粒子群优化算法优化时间卷积神经网络-双向长短期记忆神经网络融合多头注意力机制多特征分类预测/故障诊断Matlab实现
神经网络·算法·cnn
数据与人工智能律师3 小时前
智能合约漏洞导致的损失,法律责任应如何分配
大数据·网络·人工智能·算法·区块链
天天开心(∩_∩)4 小时前
代码随想录算法训练营第三十九天
算法
R-G-B4 小时前
【08】C++实战篇——C++ 生成动态库.dll 及 C++调用DLL,及实际项目中的使用技巧
c++·c++ 生成动态库.dll·c++ 生成静态库.lib·c++调用动态库.dll·c++调用静态库.lib·c++调用dll·c++调用lib
weisian1514 小时前
力扣经典算法篇-41-旋转图像(辅助数组法,原地旋转法)
算法·leetcode·职场和发展
朝朝又沐沐6 小时前
算法竞赛阶段二-数据结构(40)数据结构栈的STL
开发语言·数据结构·c++·算法
2501_927773076 小时前
数据结构——单向链表
数据结构·算法
程序猫.6 小时前
C语言 二分查找:高效搜索有序数组
c语言·算法