uva 672 dp

来源:互联网 发布:男生扯领带知乎 编辑:程序博客网 时间:2024/05/12 15:42

UVA 672 - Gangsters

n个歹徒打算打劫一个饭店。饭店的门在[0, k]的范围变化。第i个歹徒在t[i]时刻来到饭店,能打劫到p[i]的钱,但至于门的状态等于s[i]时才能进去打劫。问这n个歹徒最多能拿到多少钱。

(1N100,1K100,0T30000)
(0TiT)
(0Pi300
(1SiK)

对歹徒按时间排序。

dp[i]表示第i个歹徒能进去的情况下,前i个歹徒最多能得到多少钱。

枚举在这之前进去的歹徒j如果合理的话

dp[i] = min(dp[j] + A[i].p);

#include <bits/stdc++.h>using namespace std;const int INF = 999999999;const int N = 100 + 5;int M;int n, k, t;int dp[N];struct Node {    int t, s, p;}A[N];bool cmp (Node a, Node b) {    return a.t < b.t;}int main () {    scanf ("%d", &M);    while (M--) {        scanf ("%d%d%d", &n, &k, &t);        for (int i=1; i<=n; i++) {            scanf ("%d", &A[i].t);        }        for (int i=1; i<=n; i++) {            scanf ("%d", &A[i].p);        }        for (int i=1; i<=n; i++) {            scanf ("%d", &A[i].s);        }        sort(A+1, A+1+n, cmp);        int ans = 0;        fill (dp, dp+n+3, -INF);        dp[0] = 0;        for (int i=1; i<=n; i++) {            for (int j=0; j<i; j++) {                if (A[i].t-A[j].t >= abs(A[i].s - A[j].s)) {                    dp[i] = max(dp[i], dp[j] + A[i].p);                }            }            ans = max(ans, dp[i]);        }        printf ("%d\n", ans);        if (M != 0) printf("\n");    }    return 0;}
0 0
原创粉丝点击