E - Surf Gym - 100819S (逆向背包dp)

Sample Input Sample Output
4 8 50 2 10 40 2 2 80 9 13 20 5
110
Sample Input Sample Output
10 2079 809484 180 8347 336421 2509 3732 560423 483 2619 958859 712 7659 699612 3960 7856 831372 3673 5333 170775 1393 2133 989250 2036 2731 875483 10 7850 669453 842
3330913

思路: 逆向背包DP , 因为这些事件发生后是对后面的时间有影响。

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string>
#include <string.h>
#include <map>
//#include <unordered_map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <stack>
#include <list>
#define Fbo friend bool operator < (node a, node b)
#define mem(a, b) memset(a, b, sizeof(a))
#define FOR(a, b, c) for(int a = b; a <= c; a++)
#define RFOR(a,b, c) for(int a = b; a >= c; a--)
bool check1(int a) { return (a & (a - 1)) == 0 ? true : false; }

using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
const int INF = 0x3f3f3f3f; //路口之间的初始距离看成无穷大,相当于断开
const int mod = 1e9 + 7;
const int Maxn = 1e6+9;

int dp[Maxn*2];
int st, n;
int f[Maxn], w[Maxn];

int main() {
    //ios::sync_with_stdio(0);    
    scanf("%d", &n);
    FOR(i,0,n-1) {
        scanf("%d", &st);
        scanf("%d%d", &f[st], &w[st]); //f[st]表示起始时间为st时的权值  w[st]表示起始时间为st时候持续的时间
    }
    for (int i = Maxn-9; i >= 0; i--) {
        dp[i] = dp[i + 1];
        if (f[i]) {
            dp[i] = max(dp[i], dp[i + w[i]] + f[i]);
        }
    }
    printf("%d\n", dp[0]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/AlexLINS/p/12745881.html