RQNOJ99配制魔药(动规)

Posted gzh01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RQNOJ99配制魔药(动规)相关的知识,希望对你有一定的参考价值。

题目描述

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

注意事项:同一坩埚加工两种药材之间的时间间隔至少为 1, 也就是说用 1 个单位时间清洗坩
埚,如果不清洗就加工下一种药材的话,将会影响到药效的哦!

输入

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

输出

输出文件只有一行,只输出一个正整数,即为最大药效。

f[i][j][k]表示第i个药材时第一个坩埚最后一个药材为j,第二个坩埚最后一个药材为k时的最大药效。

 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 struct med{
 5     int t1,t2,w;
 6 }a[101];
 7 
 8 int t,n,ans,f[101][101][101];
 9 #define max(x,y) (x>y?x:y)
10 
11 bool cmp(med x,med y){
12     if(x.t1==y.t1)return x.t2<y.t2;
13     return x.t1<y.t1;
14 }
15 
16 int main(void){
17     scanf("%d%d",&t,&n);
18     for(int i=1;i<=n;++i)
19         scanf("%d%d%d",&a[i].t1,&a[i].t2,&a[i].w);
20     std::sort(a+1,a+n+1,cmp);
21     for(int i=1;i<=n;++i){
22         for(int j=0;j<i;++j){
23             for(int k=0;k<i;++k){
24                 f[i][j][k]=f[i-1][j][k];
25                 if(a[i].t1>a[j].t2)f[i][i][k]=max(f[i][i][k],f[i-1][j][k]+a[i].w);
26                 if(a[i].t1>a[k].t2)f[i][j][i]=max(f[i][j][i],f[i-1][j][k]+a[i].w);
27                 ans=max(ans,max(f[i][i][k],f[i][j][i]));
28             }
29         }
30     }
31     printf("%d",ans);
32 }

 

以上是关于RQNOJ99配制魔药(动规)的主要内容,如果未能解决你的问题,请参考以下文章

配置魔药

配置魔药 [NOIP模拟] [DP] [费用流]

RQNOJ PID192 梦幻大PK [2017年6月计划 二分图02]

PID736(rqnoj)

RQNOJ 169 最小乘车费用:水dp

RQNOJ 188 购物问题:树形dp