• 挑战练习题2.3动态规划 poj3616Milking Time dp


    题目链接:

    http://poj.org/problem?id=3616

    题意:

    奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量。

    题解:

    定义dp[i]表示第i个时间段挤奶能够得到的最大值,拆开来说,就是前面 i – 1个时间段任取0到i – 1个时间段挤奶,然后加上这个时间段(i)的产奶量之和。dp[i]满足如下递推关系:
    第i个时间段挤奶的最大值 = 前 i – 1 个时间段挤奶最大值中的最大值 + 第i次产奶量。

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 using namespace std;
     5 typedef long long ll;
     6 #define MS(a) memset(a,0,sizeof(a))
     7 #define MP make_pair
     8 #define PB push_back
     9 const int INF = 0x3f3f3f3f;
    10 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
    11 inline ll read(){
    12     ll x=0,f=1;char ch=getchar();
    13     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    14     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 //////////////////////////////////////////////////////////////////////////
    18 const int maxn = 1e3+10;
    19 
    20 struct node{
    21     int l,r,e;
    22     bool operator<(const node& rhs)const{
    23         return l < rhs.l;
    24     }
    25 }cow[maxn];
    26 
    27 int dp[maxn];
    28 
    29 int main(){
    30     int N,M,R;
    31     cin >> N >> M >> R;
    32     for(int i=0; i<M; i++){
    33         cin >> cow[i].l >> cow[i].r >> cow[i].e;
    34         cow[i].r += R;
    35     }
    36     sort(cow,cow+M);
    37 
    38     // dp[i] : 表示第i个时间段挤奶能够得到的最大值,拆开来说,就是前面 i – 1个时间段任取0到i – 1个时间段挤奶,然后加上这个时间段(i)的产奶量之和
    39 
    40     for(int i=0; i<M; i++){
    41         dp[i] = cow[i].e;
    42         for(int j=0; j<i; j++){
    43             if(cow[j].r <= cow[i].l)
    44                 dp[i] = max(dp[i],dp[j]+cow[i].e);
    45         }
    46     }
    47 
    48     cout << *max_element(dp,dp+M) << endl;
    49 
    50     return 0;
    51 }
  • 相关阅读:
    Java之hashCode的作用和equals方法的重构规则
    Java-IO流之File操作和Properties操作
    Java-IO流之转换流的使用和编码与解码原理
    Java-IO 字节流的使用和效率比较
    Java-IO流之BufferedReader 和BufferedWriter的使用和原理
    二分查找
    leetcode530 二叉搜索树的最小绝对差
    leetcode94 二叉树的中序遍历
    leetcode17电话号码字母组合
    leetcode26 删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827619.html
Copyright © 2020-2023  润新知