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;
}


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