【動態規劃】配製魔藥

题目描述

【问题描述】
在《Harry Potter and the Chamber of Secrets》中,Ron的魔杖因为坐他老爸的Flying Car撞到了打人柳,不幸被打断了,从此之后,他的魔杖的魔力就大大减少,甚至没办法执行他施的魔咒,这为Ron带来了不少的烦恼。这天上魔药课,Snape要他们每人配置一种魔药(不一定是一样的),Ron因为魔杖的问题,不能完成这个任务,他请Harry在魔药课上(自然是躲过了Snape的检查)帮他配置。现在Harry面前有两个坩埚,有许多种药材要放进坩埚里,但坩埚的能力有限,无法同时配置所有的药材。一个坩埚相同时间内只能加工一种药材,但是不一定每一种药材都要加进坩埚里。加工每种药材都有必须在一个起始时间和结束时间内完成(起始时间所在的那一刻和结束时间所在的那一刻也算在完成时间内),每种药材都有一个加工后的药效。现在要求的就是Harry可以得到最大的药效。
出自:宜昌一中
输入格式

【输入】
输入文件的第一行有2个整数,一节魔药课的t(1≤t<≤500)和药材数n(1≤n≤100)。
输入文件第2行到n+1行中每行有3个数字,分别为加工第i种药材的起始时间t1、结束时间t2、(1≤t1≤t2≤t)和药效w(1≤w≤100)。
输出格式

【输出】
输出文件medic.out只有一行,只输出一个正整数,即为最大药效。
样例输入
【输入样例】 7 4 1 2 10 4 7 20 1 3 2 3 7 3
样例输出
【输出样例】 35 
雙線程DP。
首先按結束時間按從早到晚排序(我也沒太明白是為什麼,希望讀者能有所見解),然後枚舉每一個藥材,每一個藥材有三種選擇:使用第一個坩堝加工、使用第二個坩堝加工、或不加工。
ACCode:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <bitset>

using std::max;

const char fi[] = "rqnoj99.in";
const char fo[] = "rqnoj99.out";
const int maxN = 110;
const int maxT = 510;
const int MAX = 0x3fffff00;
const int MIN = -MAX;

struct LR{int L, R, w; };

int f[maxT][maxT];
LR qujm[maxN];
int w[maxN];
int n, m;

  void init_file()
  {
    freopen(fi, "r", stdin);
    freopen(fo, "w", stdout);
  }
  
  int cmp(const void *a, const void *b)
    {return ((LR *)a) -> R - ((LR *)b) -> R; }
  
  void readdata()
  {
    scanf("%d%d", &m, &n);
    for (int i = 1; i < n + 1; ++i)
      scanf("%d%d%d", &qujm[i].L,
        &qujm[i].R, &qujm[i].w);
    qsort(qujm + 1, n, sizeof(qujm[0]), cmp);
  }
  
  void work()
  {
    for (int i = 1; i < n + 1; ++i)
     for (int j = m; j > -1; --j)
      for (int k = m; k > -1; --k)
      {
        if (j >= qujm[i].R) f[j][k] = max(f[j][k],
          f[qujm[i].L - 1][k] + qujm[i].w);
        if (k >= qujm[i].R) f[j][k] = max(f[j][k],
          f[j][qujm[i].L - 1] + qujm[i].w);
      }
    printf("%d", f[m][m]);
  }
  
int main()
{
  init_file();
  readdata();
  work();
  exit(0);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值