rqnoj 99

题目描述
【问题描述】
在《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只有一行,只输出一个正整数,即为最大药效。

很恶心的一道题,对我这种noip的菜鸡来说,这个题简直就是折磨;
思路很简洁:dp[i,j,k]表示考虑到第i个物品,第一个锅装到j,第二个锅装到k的最大值就行了,不过注意下先把魔药排个序就行了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
struct node
{
    int l,r,w;
    bool operator < (node temp)const
    {
        if(l==temp.l)
            return r<temp.r;
        return l<temp.l;
    }
}c[105];
int t,n,dp[105][105][105]; 
int main()
{
    scanf("%d%d",&t,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&c[i].l,&c[i].r,&c[i].w);
    }
    sort(c+1,c+n+1);
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<i;j++)
        {
            for(int k=0;k<i;k++)
            {
                dp[i][j][k]=dp[i-1][j][k];
                if(c[i].l>c[j].r)
                {
                    dp[i][i][k]=max(dp[i][i][k],dp[i-1][j][k]+c[i].w);
                }
                if(c[i].l>c[k].r)
                {
                    dp[i][j][i]=max(dp[i][j][i],dp[i-1][j][k]+c[i].w);
                }
                ans=max(ans,max(dp[i][j][i],dp[i][i][k]));
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值