【错题集-编程题】合唱团(动态规划 - 线性 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;
}

三、反思与改进

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


相关文章
|
5月前
|
人工智能 测试技术 调度
写用例写到怀疑人生?AI 智能测试平台帮你一键生成!
霍格沃兹测试开发学社推出AI智能测试用例生成功能,结合需求文档一键生成高质量测试用例,大幅提升效率,减少重复劳动。支持自定义提示词、多文档分析与批量管理,助力测试人员高效完成测试设计,释放更多时间投入核心分析工作。平台已开放内测,欢迎体验!
编译QCefView+VS2019+QT5.15.2
本文介绍了如何编译QCefView项目,并在VS2019和Qt 5.15.2环境下集成,包括编译结果、要点、cmake部署Qt的方法和相关参考链接。
1075 2
编译QCefView+VS2019+QT5.15.2
|
Linux C++ 开发者
几款主流好用的markdown编辑器介绍
几款主流好用的markdown编辑器介绍
1408 0
|
关系型数据库 MySQL
使用ADO.NET 实体数据模型连接MySql
使用ADO.NET 实体数据模型连接MySql
361 0
|
编解码 安全 Java
【软件测试】进阶篇 -- 详解
【软件测试】进阶篇 -- 详解
|
Web App开发 JavaScript 前端开发
【软件测试】自动化测试 Selenium 篇(一)
【软件测试】自动化测试 Selenium 篇(一)
|
小程序 安全 测试技术
【软件测试】用例篇 -- 详解(下)
【软件测试】用例篇 -- 详解(下)
|
算法 安全 测试技术
【软件测试】用例篇 -- 详解(上)
【软件测试】用例篇 -- 详解(上)
|
机器学习/深度学习 人工智能 Java
新手入门 acm 输入输出练习
A + B Problem(1000) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 355051    Accept...
24783 2