C++動態規劃算法:最多可以參加的會議數目

本周推薦閱讀

C++二分算法:得到子序列的最少操作次數

本題的其它解法

C++二分算法:最多可以參加的會議數目 II

本文涉及的基礎知識點

二分查找算法合集

題目

給你一個 events 數組,其中 events[i] = [startDayi, endDayi, valuei] ,表示第 i 個會議在 startDayi 天開始,第 endDayi 天結束,如果你參加這個會議,你能得到價值 valuei 。同時給你一個整數 k 表示你能參加的最多會議數目。
你同一時間只能參加一個會議。如果你選擇參加某個會議,那么你必須 完整 地參加完這個會議。會議結束日期是包含在會議內的,也就是說你不能同時參加一個開始日期與另一個結束日期相同的兩個會議。
請你返回能得到的會議價值 最大和 。
示例 1:
輸入:events = [[1,2,4],[3,4,3],[2,3,1]], k = 2
輸出:7
解釋:選擇綠色的活動會議 0 和 1,得到總價值和為 4 + 3 = 7 。
示例 2:
輸入:events = [[1,2,4],[3,4,3],[2,3,10]], k = 2
輸出:10
解釋:參加會議 2 ,得到價值和為 10 。
你沒法再參加別的會議了,因為跟會議 2 有重疊。你 不 需要參加滿 k 個會議。
示例 3:
輸入:events = [[1,1,1],[2,2,2],[3,3,3],[4,4,4]], k = 3
輸出:9
解釋:盡管會議互不重疊,你只能參加 3 個會議,所以選擇價值最大的 3 個會議。
**參數范圍:
1 <= k <= events.length
1 <= k * events.length <= 106
1 <= startDayi <= endDayi <= 109
1 <= valuei <= 106

分析

上面的代碼可以通過,也好理解。就是不夠簡潔,值轉索引用了大約10行。直接先按結束時間排序,然后二分查找。

變量解釋

vEndIndexNumToMaxValue[i][k]=j表示,event[0,i][1]結束,完成k個會議的最大價值。假定event[0,j)的結束時間都小于當前開始時間,event[j…)的結束時間都大于或等于當前開始時間。分兩種情況:

0==j只能完成本任務
j>0參加會議j后,再參加任務i
注意確保vEndIndexNumToMaxValue[i][k]大于等于vEndIndexNumToMaxValue[i-1][k],否則就不遞增了。遞增才能進行二分查找

代碼

錯誤代碼一

class Solution {
public:
int maxValue(vector<vector>& events, const int K) {
m_c = events.size();
sort(events.begin(), events.end(), [](const auto& v1, const auto& v2) {return v1[1] < v2[1]; });
vector<vector> vEndIndexNumToMaxValue(m_c,vector(K + 1));
int iPreIndex = 0;
for (int i = 0 ; i < m_c ; i++ )
{
const auto& v = events[i];
while ((iPreIndex < m_c) && (events[iPreIndex][1] < v[0]))
{
iPreIndex++;
}
if (0 == iPreIndex)
{
vEndIndexNumToMaxValue[i].assign(K + 1, v[2]);
vEndIndexNumToMaxValue[i][0] = 0;
continue;
}
for (int k = 1; k <= K; k++)
{
vEndIndexNumToMaxValue[i][k] = max(vEndIndexNumToMaxValue[iPreIndex-1][k-1]+v[2],(0==i)?0:vEndIndexNumToMaxValue[i-1][k]);
}
}
return vEndIndexNumToMaxValue.back().back();
}
int m_c;
};

錯誤原因

必須確保vEndIndexNumToMaxValue,k相同時,遞增。
注意:

vEndIndexNumToMaxValue[i][0] = 0;

錯誤代碼二

class Solution {
public:
int maxValue(vector<vector>& events, const int K) {
m_c = events.size();
sort(events.begin(), events.end(), [](const auto& v1, const auto& v2) {return v1[1] < v2[1]; });
vector<vector> vEndIndexNumToMaxValue(m_c,vector(K + 1));
int iPreIndex = 0;
for (int i = 0 ; i < m_c ; i++ )
{
const auto& v = events[i];
while ((iPreIndex < m_c) && (events[iPreIndex][1] < v[0]))
{
iPreIndex++;
}
for (int k = 1; k <= K; k++)
{
const int iPreMax = (0 == iPreIndex) ? 0 : vEndIndexNumToMaxValue[iPreIndex - 1][k - 1];
vEndIndexNumToMaxValue[i][k] = max(iPreMax +v[2],(0==i)?0:vEndIndexNumToMaxValue[i-1][k]);
}
}
return vEndIndexNumToMaxValue.back().back();
}
int m_c;
};

錯誤原因

開始時間并不是遞增的。

正確代碼

class Solution {
public:int maxValue(vector<vector<int>>& events, const int K) {m_c = events.size();sort(events.begin(), events.end(), [](const auto& v1, const auto& v2) {return v1[1] < v2[1]; });vector<vector<int>> vEndIndexNumToMaxValue(m_c,vector<int>(K + 1));for (int i = 0 ; i < m_c ; i++ ){const auto& v = events[i];auto it = std::lower_bound(events.begin(), events.end(), v[0], [](const auto& v, int i) {return v[1] < i; });const int iLowerIndex = it - events.begin();			for (int k = 1; k <= K; k++){const int iPreMax = (0 == iLowerIndex) ? 0 : vEndIndexNumToMaxValue[iLowerIndex - 1][k - 1];vEndIndexNumToMaxValue[i][k] = max(iPreMax +v[2],(0==i)?0:vEndIndexNumToMaxValue[i-1][k]);}		}	return vEndIndexNumToMaxValue.back().back();}int m_c;
};

測試用例

template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}

template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
Assert(v1[i], v2[i]);
}
}

int main()
{
vector<vector> events;
int k;
int res;
{
Solution slu;
events = { {53, 55, 77},{37, 56, 58} };
k = 1;
res = slu.maxValue(events, k);
Assert(res, 77);
}
{
Solution slu;
events = { {1,2,4},{3,4,3},{2,3,1} };
k = 2;
res = slu.maxValue(events, k);
Assert(res, 7);
}
{
Solution slu;
events = { {1,2,4},{3,4,3},{2,3,10} };
k = 2;
res = slu.maxValue(events, k);
Assert(res, 10);
}
{
Solution slu;
events = { {1,1,1},{2,2,2},{3,3,3},{4,4,4} };
k = 3;
res = slu.maxValue(events, k);
Assert(res, 9);
}
{
Solution slu;
events = { {21,77,43},{2,74,47},{6,59,22},{47,47,38},{13,74,57},{27,55,27},{8,15,8} };
k = 4;
res = slu.maxValue(events, k);
Assert(res, 57);
}

//CConsole::Out(res);

}

擴展閱讀

視頻課程

有效學習:明確的目標 及時的反饋 拉伸區(難度合適),可以先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成戰斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176

相關下載

想高屋建瓴的學習算法,請下載《喜缺全書算法冊》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想對大家說的話
聞缺陷則喜是一個美好的愿望,早發現問題,早修改問題,給老板節約錢。
子墨子言之:事無終始,無務多業。也就是我們常說的專業的人做專業的事。
如果程序是一條龍,那算法就是他的是睛

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/168268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/168268.shtml
英文地址,請注明出處:http://en.pswp.cn/news/168268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python庫設置HTTP請求頭字段User-Agent

User-Agent 字段是一個 HTTP 請求頭&#xff0c;用于標識發起請求的客戶端&#xff08;例如瀏覽器、應用程序等&#xff09;。服務器可以根據 User-Agent 字段來識別客戶端的類型和版本&#xff0c;以便提供適當的響應。 User-Agent 字符串通常包含以下內容&#xff1a; 客戶…

為什么要隱藏id地址?使用IP代理技術可以實現嗎?

隨著網絡技術的不斷發展&#xff0c;越來越多的人開始意識到保護個人隱私的重要性。其中&#xff0c;隱藏自己的IP地址已經成為了一種常見的保護措施。那么&#xff0c;為什么要隱藏IP地址&#xff1f;使用IP代理技術可以實現嗎&#xff1f;下面就一起來探討這些問題。 首先&am…

Qt 軟件調試(二)使用dump捕獲崩潰信息

Qt應用程序異常崩潰該怎么辦&#xff0c;生成dump文件再回溯分析&#xff0c;可以快速且準確的幫助我們定位到崩潰的點。那么&#xff0c;本章我們分享下如何在Qt中生成dump文件。 一、使用minudump捕獲崩潰信息 #include <QCoreApplication> #include <QDir> #i…

k8s docker總結特殊點

k8s docker總結特殊點 前言一、docker 的驅動。1、cgroup:&#xff08;Control Groups&#xff09;2、日志驅動&#xff08;log driver&#xff09;3、存儲驅動4、網絡驅動&#xff1a; 二、k8s中網絡插件&#xff08;常用calico&#xff0c;次flannel&#xff09;**Flannel:**…

【洛谷 P1636】Einstein學畫畫 題解(圖論+歐拉通路)

Einstein學畫畫 題目描述 Einstein 學起了畫畫。 此人比較懶~~&#xff0c;他希望用最少的筆畫畫出一張畫…… 給定一個無向圖&#xff0c;包含 n n n 個頂點&#xff08;編號 1 ~ n 1 \sim n 1~n&#xff09;&#xff0c; m m m 條邊&#xff0c;求最少用多少筆可以畫…

nodejs微信小程序+python+PHP-書吧租閱管理系統的設計與實現-安卓-計算機畢業設計

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性&#xff1a;…

深度學習+不良身體姿勢檢測+警報系統+代碼+部署(姿態識別矯正系統)

正確的身體姿勢是一個人整體健康的關鍵。然而&#xff0c;保持正確的身體姿勢可能很困難&#xff0c;因為我們經常忘記這一點。這篇博文將引導您完成為此構建解決方案所需的步驟。最近&#xff0c;我們在使用 POSE 進行身體姿勢檢測方面玩得很開心。它就像一個魅力&#xff01;…

Ubuntu20安裝ssh服務

Ubuntu20上執行如下命令查看是否存在ssh服務 #ps -e | grep ssh 只有ssh-agent&#xff0c;沒有sshd; 因此要安裝openssh-server. 搜索openssh-server,得到下載鏈接&#xff1a; openssh-server 復制這個Binary Package鏈接即可下載&#xff0c;然后使用如下命令安裝 sudo…

Ruoyi項目傳List到后臺并使用Excel模板下載數據的方法以及遇到的各種前后端數據交互問題

import { download } from @/utils/requestconst app = createApp(App)// 全局方法掛載 app.config.globalProperties.download = download 首先因為ruoyi-ui中的main.js有配置如上全局注冊: 因此只需要在vue中定義一個方法直接使用this.download調用下載即可: (download的3…

Hausdorff是什么距離,怎樣計算的

Hausdorff距離是一種用于度量兩個集合之間的相似性或差異性的距離度量指標。它基于數學家Felix Hausdorff的工作而得名。 對于給定的兩個集合A和B&#xff0c;Hausdorff距離定義為集合A中的每個點到集合B的最近點的最大距離&#xff0c;與集合B中的每個點到集合A的最近點的最大…

C++列表初始化

1.列表初始化 注意和初始化列表區分開來&#xff0c;在 C 98 中允許使用花括號對數組或者結構體元素進行統一的初始值設定。 struct Point {int _x;int _y; };int main() {int array1[] { 1, 2, 3, 4, 5 };int array2[5] { 0 };Point p { 1, 2 };return 0; }而 C 11 擴大了…

PyQt6庫和工具庫QTDesigner安裝與配置

鋒哥原創的PyQt6視頻教程&#xff1a; 2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~共計12條視頻&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面開發 視頻教程(無廢話版…

c語言第七彈--掃雷小游戲!

今天做一個有趣的掃雷小游戲 現在正式開始設計。 思路&#xff1a;想要根本上實現必須擁有 實現函數的主體.c文件 頭文件.h 及頭文件實現.c。 頭文件.h #pragma once #include <stdio.h> #include <stdlib.h> #include <time.h> #define EASY_COUNT 10 #d…

【knife4j-spring-boot】Springboot + knife4j-spring-boot 整合swagger腳手架

swagger-boostrap-ui從1.x版本到如今2.x&#xff0c;同時也更改名字Knife4j 在此記錄下 knife4j-spring-boot-starter 的整合。 只需要引入knife4j-spring-boot-starter&#xff0c;無需引入其他的swagger包&#xff0c;knife4j-spring-boot-starter已經包含。 官方版本說明…

mysql1124實驗七索引管理

實驗任務七 索引管理實驗任務書 1. 實驗目的 掌握在MySQL中使用MySQL Workbench或者SQL語句創建和使用索引的方法&#xff08;以SQL命令為重點&#xff09;。 掌握在MySQL中使用MySQL Workbench或者SQL語句查看和刪除索引的方法&#xff08;以SQL命令為重點&#xff09;。 …

詳細解答T-SNE程序中from sklearn.manifold import TSNE的數據設置,包括輸入數據,繪制顏色的參數設置,代碼復制可用!!

文章目錄 前言——TSNE是t-Distributed Stochastic Neighbor Embedding的縮寫1、可運行的T-SNE程序2. 實驗結果3、針對上述程序我們詳細分析T-SNE的使用方法3.1 加載數據3.2 TSNE降維3.3 繪制點3.4 關于顏色設置&#xff0c;顏色使用的標簽數據的說明cy 總結 前言——TSNE是t-D…

Centos Download

前言 CentOS Linux 是一個社區支持的發行版&#xff0c;源自 CentOS git for Red Hat Enterprise Linux &#xff08;RHEL&#xff09; 上免費提供給公眾的源代碼。因此&#xff0c;CentOS Linux 的目標是在功能上與 RHEL 兼容。CentOS 計劃主要更改組件以刪除上游供應商的品牌…

Redis的四種模式:單機、主從、哨兵、集群

一、簡單理解 單機模式&#xff1a;安裝你的redis&#xff0c;啟動服務即為單機模式。 主從模式&#xff1a;一個主節點搭配一個或多個從節點&#xff0c;無自動故障轉移功能&#xff0c;主節點發生故障后&#xff0c;需要人工將其中一個從節點設置為主節點。 哨兵模式&…

【微服務專題】SpringBoot自動配置源碼解析

目錄 前言閱讀對象閱讀導航前置知識筆記正文0、什么是自動配置0.1 基本概念0.2 SpringBoot中的【約定大于配置】0.3 從SpringMVC看【約定大于配置】0.4 從Redis看【約定大于配置】 一、EnableAutoConfiguration源碼解析二、SpringBoot常用條件注解源碼解析2.1 自定義條件注解2.…

java 反射和注解1-反射詳解

反射和注解本就是一家人&#xff0c;注解離不開反射&#xff0c;這里先將反射的寫法&#xff0c;本文涉到的注解暫時可以不不用理解 1&#xff0c;創建一個類 public class ReflexUser {public String name;private String namePrivate;protected String nameProtected;Strin…