POJ1036——动态规划

题目描述:

有一伙人要去饭店,饭店的门可以控制大小,但是每个时间间隔只能开大一个或者关闭一个,每个人有一个肥胖值,到场时间和繁荣度。人在他的到场时间到达饭店,如果饭店的门正好符合他的体型,饭店就能获得当前的繁荣度。问最大的繁荣度是多少。

大致思路:

这个题目一看就是一个很明显的动规。对于一个时间T和一个人P,T时间下S开度的状态只能从0-T-S转移过来,有了这个就有了状态方程。

dp[i] = max(dp[j] + p);其中ti-tj>si-sj。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;

const int maxn = 100 + 10;

struct gang {
    int p,s,t;
    bool operator < (const gang& ano) const{
        return t < ano.t;
    }
}g[maxn];

int n,k,t;
int ans[maxn];

int main() {
    scanf("%d%d%d",&n,&k,&t);
    for (int i = 1; i <= n; i++) scanf("%d",&g[i].t);
    for (int i = 1; i <= n; i++) scanf("%d",&g[i].p);
    for (int i = 1; i <= n; i++) scanf("%d",&g[i].s);
    memset(ans,0,sizeof(ans));
    g[0].t = g[0].s = g[0].p = 0;
    sort(g + 1,g + n + 1);
    int maxans = 0;
    for (int i = 1; i <= n; i++) {
        ans[i] = -1;
        for (int j = 0; j < i; j++) {
            if (ans[j] == -1) continue;
            int tmp = abs(g[i].s-g[j].s);
            if (tmp > g[i].t - g[j].t) continue;
            ans[i] = max(ans[i],ans[j] + g[i].p);
        }
        maxans = max(maxans,ans[i]);
    }
    cout<<maxans<<endl;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章