poj3616 Milking Time(状态转移方程,类似LIS)

https://vjudge.net/problem/POJ-3616

猛刷简单dp的第一天第二题。

这道题乍一看跟背包很像,不同的在于它是一个区间,背包是定点,试了很久想往背包上套,都没成功。

这题的思路感觉有点陌生,又有点类似于求最长不降子序列的题。

dp[i]为到第i个区间为止(该区间肯定有i)的最大挤奶量,最后从m个里面取最大。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<stack>
 8 #define lson l, m, rt<<1
 9 #define rson m+1, r, rt<<1|1
10 #define INF 0x3f3f3f3f
11 typedef unsigned long long ll;
12 using namespace std;
13 struct Node{
14     int from, to, w;
15 }node[100010];
16 int dp[100010];
17 bool cmp(const Node a, const Node b)
18 {
19     return a.to < b.to;
20 }
21 int main()
22 {
23     int n, m, r;
24     cin >> n >> m >> r;
25     for(int i = 0; i < m; i++){
26         cin >> node[i].from >> node[i].to >> node[i].w;
27     }
28     memset(dp, 0, sizeof(dp));
29     sort(node, node+m, cmp);//按结束时间升序
30     for(int i = 0; i < m; i++){
31         dp[i] = node[i].w;
32         for(int j = 0; j < i; j++){
33             if(node[i].from >= node[j].to+r){
34                 dp[i] = max(dp[i], dp[j]+node[i].w);//人人为我
35             }
36         }
37     }
38     int maxm = -INF;
39     for(int i = 0; i < m; i++){
40         maxm = max(maxm, dp[i]);
41     }
42     cout << maxm << endl;
43     return 0;
44 }

原文地址:https://www.cnblogs.com/Surprisezang/p/9026899.html

时间: 2024-10-10 17:13:45

poj3616 Milking Time(状态转移方程,类似LIS)的相关文章

动态规划(DP),类似LIS,FatMouse&#39;s Speed

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weight相同的按照speed从大到小排列; 2.Count[i]表示到第i个老鼠时,所求的最长“速度递减”子序列的长度: 3.path[i]=j是题目的关键,记录在Count[i]=Count[j]时,即最长“速度递减”子序列最后一个老鼠的前一只老鼠的位置 4.递归输出id void output(in

DP问题各种模型的状态转移方程 (转)

1(最长公共子串(注意和最长公共子序列区别)) 两个字符串str1和str2,长度分别为(l1,l2) dp[i][j]表示以两个字符串分别以第i和第j个字符结尾所能达到的公共子序列的长度,由于下面涉及到i-1和j-1,那么这个时候我们一般从i=1和j=1开始到i<=len1, j<=len2. if(str[i-1]=str[j-1]) dp[i][j]=dp[i-1][j-1]+1; if(str[i-1]!=str[j-1]) dp[i][j]=0; 0 ;              

Mark一下, dp状态转移方程写对,但是写代码都错,poj 1651 poj 1179

dp题: 1.写状态转移方程; 2.考虑初始化边界,有意义的赋定值,还没计算的赋边界值: 3.怎么写代码自底向上计算最优值 今天做了几个基础dp,全部是dp方程写对但是初始化以及计算写错 先是poj 1651 其实就是个赤裸裸的矩阵连乘,dp方程很容易写出 dp[i][j]=min(dp[i][k]+dp[k+1][j]+r[i]*c[k]*c[j],dp[i][j]); 先贴两个个二逼的代码,mark下自己多么的二逼: 二逼一:在计算的时候使用了还没有算出来的值,模拟下就知道第一重循环里算dp

【转载】 HDU 动态规划46题【只提供思路与状态转移方程】

1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋); 正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v)  其

[转]DP问题各种模型的状态转移方程

1(最长公共子串(注意和最长公共子序列区别)) 两个字符串str1和str2,长度分别为(l1,l2) dp[i][j]表示以两个字符串分别以第i和第j个字符结尾所能达到的公共子序列的长度,由于下面涉及到i-1和j-1,那么这个时候我们一般从i=1和j=1开始到i<=len1, j<=len2. if(str[i-1]=str[j-1]) dp[i][j]=dp[i-1][j-1]+1; if(str[i-1]!=str[j-1]) dp[i][j]=0; 0 ;              

动态规划(下):如何求得状态转移方程并进行编程实现?

动态规划(下):如何求得状态转移方程并进行编程实现? 状态转移方程和编程实现 这里面求最小值的 min 函数里有三个参数,分别对应我们上节讲的三种情况的编辑距离,分别是:替换.插入和删除字符.在表格的右下角标出了两个字符串的编辑距离 1. 我们假设字符数组 A[]和 B[]分别表示字符串 A 和 B,A[i]表示字符串 A 中第 i 个位置的字符,B[i]表示字符串 B 中第 i 个位置的字符.二维数组 d[,]表示刚刚用于推导的二维表格,而 d[i,j]表示这张表格中第 i 行.第 j 列求得

POJ3616 Milking Time 【DP】

Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4917   Accepted: 2062 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤

简单dp的状态转移方程集合

1.对于任一种N的排列A,定义它的E值为序列中满足A[i]>i的数的个数.给定N和K(K<=N<=1000),问N的排列中E值为K的个数. dp[i][j]表示i个数的排列中E值为j的个数.假设现在已有一个E值为j的i的排列,对于新加入的一个数i+1,将其加入排列的方法有三:1)把它 放最后,加入后E值不变    2)把它和一个满足A[k]>k的数交换,交换后E值不变       3)把它和一个不满足A[k]>k的数交换,交换后E值+1      根据这三种方法得到转移方程d

POJ3616——Milking Time

Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4964   Accepted: 2076 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤