HDU 1574 RP问题(01背包变形)
来源:互联网 发布:文字照片软件 编辑:程序博客网 时间:2024/05/16 18:18
转载:http://blog.csdn.net/mnlm1991/article/details/6083262
RP问题
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 959 Accepted Submission(s): 353
Problem Description
在人类社会中,任何个体都具有人品,人品有各种不同的形式,可以从一种形式转换为另一种形式,从一个个体传递给另一个个体,在转换和传递的过程中,人品不会消失,也不被能创造,这就是,人品守恒定律!
人品守恒定律更形象的描述,当发生一件好事,你从中获利,必定消耗一定量RP;当发生一件不幸的事,你在其中有所损失,必定积攒一定量RP。
假设在一个时间段内在你身上可能会发生N个事件,每个事件都对应一个RP变化值a、RP门槛值b和获益值c。当RP变化值a为正,获益值c必定为负,只有你当前的RP值小于等于RP门槛值b的时候,此事件才有可能发生,当此事件发生时,你的RP值将增加|a|,获益值将减少|c|。反之,当RP变化值a为负,获益值c必定为正,只有你当前的RP值大于等于RP门槛值b的时候,此事件才有可能发生,当此事件发生时,你的RP值将减少|a|,获益值将增加|c|。
一个事件在满足上述RP条件的前提下,未必会发生。假设在这段时间之前你所具有的RP值和获益值都为0,那么过了这段时间后,你可能达到的最大获益值是多少?
注意:一个人的所具有的RP值可能为负。
人品守恒定律更形象的描述,当发生一件好事,你从中获利,必定消耗一定量RP;当发生一件不幸的事,你在其中有所损失,必定积攒一定量RP。
假设在一个时间段内在你身上可能会发生N个事件,每个事件都对应一个RP变化值a、RP门槛值b和获益值c。当RP变化值a为正,获益值c必定为负,只有你当前的RP值小于等于RP门槛值b的时候,此事件才有可能发生,当此事件发生时,你的RP值将增加|a|,获益值将减少|c|。反之,当RP变化值a为负,获益值c必定为正,只有你当前的RP值大于等于RP门槛值b的时候,此事件才有可能发生,当此事件发生时,你的RP值将减少|a|,获益值将增加|c|。
一个事件在满足上述RP条件的前提下,未必会发生。假设在这段时间之前你所具有的RP值和获益值都为0,那么过了这段时间后,你可能达到的最大获益值是多少?
注意:一个人的所具有的RP值可能为负。
Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每组测试数据的第一行为一个正整数N (0 < N <= 1000),表示这个时间段在你身上可能发生N个事件。接下来N行,每行有三个整数a, b, c (0 <= |a| <= 10, 0 <= |b| <= 10000, 0 <= |c| <= 10000)。这N个事件是按照输入先后顺序先后发生的。也就是说不可能先发生第i行的事件,然后再发生i – j行的事件。
Output
对应每一组输入,在独立一行中输出一个正整数,表示最大可能获益值。
Sample Input
31-1 0 1210 200 -1-5 8 33-5 0 410 -5 -5-5 5 10
Sample Output
129
Author
lwg
Source
HDU 2007-1 Programming Contest
/*思路:01背包变形 问题描述:有N件连续的事件,有些事件是RP值增加a,获益值减少c。有些则相反。每件事件还有一个RP门槛b,RP值增加的事件RP得>=RP门槛,RP值减少的事件则得RP<=RP门槛。满足上述条件不一定就会发生。其中N<= 1000 ,a<=10,b<=10000,c<=10000;求这些事件的最大获益值, 事件发生的顺序按照输入先后顺序先后发生,也就是说不可能先发生第i行的事件, 然后再发生i – j行的事件。开始RP和获益值都为0; 算法:是DP题。一件事件发生与否只和当前RP有关,所以想到存储到达某个事件是各个RP的最大获益。不能开二维的数组(数据太大),只能开一个dp[20001];dp[j]表示RP为j - 10000; 另外还要一个标记数组,标记是否可以出现这个RP值;*//* 转载 */ #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<vector> #include<algorithm> #include<string> #include<map> #include<bitset> #include<queue> using namespace std; const int size = 20001; int dp[size]; //默认加了10000 int T; int N; bool visited[size]; int main() { scanf("%d", &T); while (T--) { scanf("%d", &N); int a, b, c; int i; int j; memset(dp, 0, sizeof(dp)); memset(visited, 0, sizeof(visited)); dp[10000] = 0; //相当于初始第一个 visited[10000] = true; //初始0是可以达到的 for (i = 0; i < N; i++) { scanf("%d%d%d", &a, &b, &c); if (a > 0)//a大于0 c是小于0 当RP要小于RP门槛 才能 { for (j = b + 10000; j >= 0; j--) //RP门槛B,当前门槛j要小于等于b { if (visited[j]) //当前人品j要可以达到 { if (!visited[j + a]) //如果加了人品之前没达到,就初始化 { dp[j + a] = dp[j] + c; visited[j + a] = true; } else //否则就看要不要拿 { dp[j + a] = max(dp[j + a], dp[j] + c); } } } } else if (a < 0) //a<0 c>0 当前人品j大于门槛人品b,才行 { for (j = b + 10000; j < size; j++) { if (visited[j]) { if (!visited[j + a]) { dp[j + a] = dp[j] + c; visited[j + a] = true; } else { dp[j + a] = max(dp[j + a], dp[j] + c); } } } } } int ans = 0; for (i = 0; i < size; i++) { if (visited[i] && dp[i] > ans) { ans = dp[i]; } } printf("%d\n", ans); } return 0; }
0 0
- HDU 1574 RP问题(01背包变形)
- hdu 1574 RP问题 动态规划,01背包的变形
- HDU - 1574 RP问题(01背包)
- hdu 1574 RP问题 dp 01背包
- HDU 1574 RP问题 (类0 1 背包)
- HDU 1574 RP问题
- hdu 1574 RP问题
- HDU 1574-RP问题
- hdu 5410(背包问题变形)
- 01背包变形 HDU 2660
- 01背包变形 HDU 3496
- HDU 3466 01背包变形
- hdu 1171 01背包变形
- hdu 2955(01背包变形)
- HDU 1171 01背包变形
- hdu 1574 RP问题 DP
- HDU 1574 RP问题(DP)
- RP问题(HDU 1574)—— 0-1背包(需深入理解)
- sort之结构体排序1
- maven 教程五 将项目发布到私服
- python xpath 语法
- 向指定URL发送GET或POST请求(调第三方接口)
- 模式识别(Pattern Recognition)学习笔记(四)——最小风险贝叶斯决策
- HDU 1574 RP问题(01背包变形)
- java中的栈与堆
- 4412按键驱动移植(按键对应Android系统的三个虚拟按键)
- Android USB Host与HID通讯
- 阅读英文
- 56、cache是什么?
- Poj 3259 Wormholes【spfa 负环判断】
- android源码
- pyspark的初始调用