IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【牛客网】KY139 毕业bg -> 正文阅读

[数据结构与算法]【牛客网】KY139 毕业bg

在这里插入图片描述

关于贪心的使用————每个阶段的最优状态都是由上一个阶段的最优状态得到的,那么该问题的状态和阶段是什么呢?现在来看关于阶段的定义,所谓阶段是指随着问题的解决,在同一个时刻可能会得到的不同状态的集合。我们可以把时间作为划分阶段的尺度,那么就是第 i 小时,就是第i阶段。因为本题要求最大快乐度,那么状态的对象一定是最大快乐度,既然阶段是时间,那么怎么定义才能让一个阶段包含多个不同状态的集合,那就是参加的不同活动的集合所带来的最大快乐度,对于本题,在一个给定的时间 i 可能一个人参加了活动1,但他同样能通过参加活动2来获得同样的快乐度。现在考虑,能不能符合————“每个阶段的最优状态都是由上一个阶段的最优状态得到”?显然是不能的,例如上一个阶段,也就是第i小时的最优状态,必定是参加了某几个活动而获得的最大快乐度。而来到了第i+1小时,现在又新增了能参加的活动,可是若该活动的开始时间与之前的活动冲突,但其提供的最大快乐度又大于之前的状态,明显,上一个阶段的最优状态并不能得到现阶段的最优解

现在,再来看动态规划,每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到放到这一道题怎么理解呢,因为前一阶段所参加了的活动可能正好与更好的活动冲突,我们可能需要跟之前的阶段,那个时候的状态能与现在这个更好的活动正好分隔开来,而之前的这个阶段的状态也一定是通过某种方法得到的,我们可以不用关心他又是怎么得来的,所以本题是符合动态规划的定义的!!因此我们定义dp[j]为j时刻所获得的最大快乐度,通过遍历所有活动,在遍历所有时间来转移所要的状态。在动态规划中又是背包的形式,状态转移方程就是,

dp[j] = Max(dp[j - bg[i].time] + bg[i].joy,dp[j]) 其中j>=bg[i].time

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 30 + 10;

struct BG{
    int happy;
    int last;
    int time;
    bool operator<(const BG b) const{
        return time < b.time;
    }
};

BG bg[N];
int dp[N];

int main(){
    int n;
    while(scanf("%d", &n) != EOF && n > 0){
        for(int i = 0; i < n; i++){
            scanf("%d%d%d", &bg[i].happy, &bg[i].last, &bg[i].time);
        }
        //要把每个活动最晚结束时间sort一下,不然不能保证某一阶段得到的是最优状态
        sort(bg, bg + n);
        int maximum = 0;
        memset(dp, 0, sizeof(dp));
        for(int i = 0; i < n; i++){
            for(int j = bg[i].time; j >= bg[i].last; j--){
                dp[j] = max(dp[j], dp[j - bg[i].last] + bg[i].happy);
                maximum = max(maximum, dp[j]);
            }
        }
        printf("%d\n", maximum);
    }
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:39:43  更:2022-03-03 16:41:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:43:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码