【RQNOJ 99】配制魔药(DP)

题目描述

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

 

转载于:https://www.cnblogs.com/gzh01/p/9379703.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值