【错题集-编程题】合唱团(动态规划 - 线性 dp)

简介: 【错题集-编程题】合唱团(动态规划 - 线性 dp)

牛客对应题目链接:合唱团_牛客题霸_牛客网 (nowcoder.com)


一、分析题目

线性 dp


1、状态表示

f[i][j]:从前 i 个人中挑选出 j 个人,arr[i] 必选的最大乘积。

g[i][j]:从前 i 个人中挑选出 j 个人,arr[i] 必选的最小乘积。


2、返回值

返回 max(f[k][k] ~ f[n][k])


3、状态转移方程

f[i][j] = max(f[prev][j-1] * arr[i], g[prev][j-1] * arr[i]);(max(i-d, j-1) <= prev <= i-1)

f[i][j] = min(f[prev][j-1] * arr[i], g[prev][j-1] * arr[i]);(max(i-d, j-1) <= prev <= i-1)


4、初始化

  • f[i][j]=-INF,g[i][j]=INF(避免影响后续取值)
  • f[i][1] = g[i][1] = arr[i]

注意:这里的取值范围很大,所以要用到 long long 来存储结果,那么这里的 INF 可以设为 LLONG_MAX 或 0x3f3f3f3f3f3f3f3f。


二、代码

//值得学习的代码
#include <iostream>
using namespace std;
 
typedef long long LL;
 
const int N = 55, M = 15;
const LL INF = 0x3f3f3f3f3f3f3f3f;
 
int n, k, d;
LL arr[N];
LL f[N][M], g[N][M];
 
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> arr[i];
    cin >> k >> d;
 
    // 初始化放在填表中进⾏了
 
    for(int i = 1; i <= n; i++) // 填写每⼀⾏
    {
        g[i][1] = f[i][1] = arr[i];
        for(int j = 2; j <= min(i, k); j++) // 挑选⼏个⼈
        {
            f[i][j] = -INF; // 初始化
            g[i][j] = INF; // 初始化
            for(int prev = max(i - d, j - 1); prev <= i - 1; prev++) // 前⾯挑选的最后⼀个位置
            {
                f[i][j] = max(max(f[prev][j - 1] * arr[i], g[prev][j - 1] * arr[i]), f[i][j]);
                g[i][j] = min(min(f[prev][j - 1] * arr[i], g[prev][j - 1] * arr[i]), g[i][j]);
            }
        }
    }
 
    LL ret = -INF;
    for(int i = k; i <= n; i++) ret = max(ret, f[i][k]);
    cout << ret << endl;
 
    return 0;
}

三、反思与改进

这题真没有思路,加上前面的题目也没有通过全部样例,有点影响对这道题的思考。认真反思,汲取经验。


目录
打赏
0
0
0
0
9
分享
相关文章
【机器学习】K-means聚类的停止标准是什么?
【5月更文挑战第11天】【机器学习】K-means聚类的停止标准是什么?
【机器学习】K-means和KNN算法有什么区别?
【5月更文挑战第11天】【机器学习】K-means和KNN算法有什么区别?
kde
|
12天前
|
Docker镜像加速指南:手把手教你配置国内镜像源
配置国内镜像源可大幅提升 Docker 拉取速度,解决访问 Docker Hub 缓慢问题。本文详解 Linux、Docker Desktop 配置方法,并提供测速对比与常见问题解答,附最新可用镜像源列表,助力高效开发部署。
kde
8208 49
|
9天前
typora免费版,激活方法,Typora使用教程
Typora是一款简洁高效的Markdown编辑器,支持即时渲染。本教程涵盖安装方法、文件操作、视图控制、格式排版、字体样式及Markdown语法,助你快速上手使用Typora进行高效写作。
2157 4
Dify MCP 保姆级教程来了!
大语言模型,例如 DeepSeek,如果不能联网、不能操作外部工具,只能是聊天机器人。除了聊天没什么可做的。
2034 30
国内如何安装和使用 Claude Code镜像教程 - Windows 用户篇
国内如何安装和使用 Claude Code镜像教程 - Windows 用户篇
1128 5
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问