HDOJ 1574

来源:互联网 发布:安卓 服务器端 json 编辑:程序博客网 时间:2024/05/28 15:10

RP问题

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 741    Accepted Submission(s): 225


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值可能为负。
 

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
 

Recommend
linle
 
一道比较简单的DP,但是数据范围比较大,一开始没想出怎么搞,后来发现有的大神用一个visit数组记录该RP出现过没有,这样就简单多了。
PS:RP值可能为负,于是都加上10000,使之都为正。
#include <cstdio>#include <cmath>#include <algorithm>#include <iostream>#include <cstring>#include <map>#include <string>#include <stack>#include <cctype>#include <vector>#include <queue>#include <set>#include <iomanip>using namespace std;//#define Online_Judge#define outstars cout << "***********************" << endl;#define clr(a,b) memset(a,b,sizeof(a))#define lson l , mid  , rt << 1#define rson mid + 1 , r , rt << 1|1#define FOR(i , x , n) for(int i = (x) ; i < (n) ; i++)#define FORR(i , x , n) for(int i = (x) ; i <= (n) ; i++)#define REP(i , x , n) for(int i = (x) ; i > (n) ; i--)#define REPP(i ,x , n) for(int i = (x) ; i >= (n) ; i--)#define mk make_pairconst int inf = 1 << 30;const int MAXN = 20000 + 150;const int maxw = 100 + 20;const int MAXNNODE = 1000 +10;const long long LLMAX = 0x7fffffffffffffffLL;const long long LLMIN = 0x8000000000000000LL;const int INF = 0x7fffffff;const int IMIN = 0x80000000;#define eps 1e-8#define mod 20071027typedef long long LL;const double PI = acos(-1.0);typedef double D;typedef pair<int , int> pii;const D e = 2.718281828459;int dp[MAXN];///表示RP值为j - 10000时的最大收益int a[MAXN] , b[MAXN] , c[MAXN];bool vis[MAXN];int main(){    //ios::sync_with_stdio(false);#ifdef Online_Judge    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);#endif // Online_Judge    int T , n ;    cin >> T;    while(T--)    {        scanf("%d" , &n);        FOR(i , 0 , n)        {            scanf("%d%d%d" , &a[i] , &b[i] , &c[i]);        }        clr(dp , 0);        clr(vis  , false);        dp[10000] = 0;        vis[10000] = true;        FOR(i , 0 , n)        {            if(a[i] > 0)            {                REPP(j , b[i] + 10000 , 0)                {                    if(vis[j])                    {                        if(!vis[a[i] + j])                        {                            dp[j + a[i]] = dp[j] + c[i];                            vis[j + a[i]] = true;                        }                        else                        {                            dp[j + a[i]] = max(dp[a[i] + j] , dp[j] + c[i]);                        }                    }                }            }            else if(a[i] < 0)            {                FOR(j , b[i] + 10000 , MAXN)                {                    if(vis[j])                    {                        if(!vis[j + a[i]])                        {                            dp[j + a[i]] = dp[j] + c[i];                            vis[j + a[i]] = true;                        }                        else                        {                            dp[j + a[i]] = max(dp[a[i] + j] , dp[j] + c[i]);                        }                    }                }            }        }        int max_rp = 0;        FOR(i , 0 , MAXN)        {            if(vis[i])max_rp = max(max_rp , dp[i]);        }        cout << max_rp << endl;    }    return 0;}


原创粉丝点击