NCSTOJ 1408 搬砖 —— 动态规划

题目描述

Sam暑假找了个搬砖的活儿,每天12个小时内有1~8种转可以搬,每种的时间的工资都不一样(如搬第一种砖的时间为0时~4时,工资为5元,搬第二种砖的时间为2时~6时,工资为8元),每次搬砖必须搬完才能搬下一次转(即不可重叠,如上例中搬第一种砖就不能搬第二种转),请你帮Sam拿拿主意,怎样安排可以赚到最多的工资?

输入

输入包含八组(八种砖),每组包含三个整数:搬砖开始时间s1、结束时间s2与工资sal。(0 <= s1 < 11 , 0 < s2 <= 11 , 1 <= sal <= 10)。

输出

Sam12小时内最多可以赚到的工资。

样例输入
3 5 1
1 4 5
0 6 8
4 7 4
3 8 6
5 9 3
6 10 2
8 11 4
样例输出
13
提示

对于样例的解释:
选择工作1、工作4、工作8,可以赚到13元。

这道题三个要点。
  1. 使用数组dp[i]记录选择第1~第i个工作可以得到的最大工资。dp[8]是答案。
  2. 对所有工作排序。
  3. 使用数组pre[i]记录选择第[i]个工作时,之前最晚可以选择的工作。
动态转移方程:

dp[i]有两种情况:

  • 选:dp[i] = 工作[i]的工资 + dp[i-1]
  • 不选:dp[i] = dp[i-1]

即:dp[i] = max(bz[i].sal + dp[pre[i]], dp[i-1])

#include <bits/stdc++.h>
using namespace std;
const int N = 10;
struct BZ{
   
    int s1,s2,sal;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值