有一夥人要去飯店,飯店的門可以控制大小,但是每個時間間隔只能開大一個或者關閉一個,每個人有一個肥胖值,到場時間和繁榮度。人在他的到場時間到達飯店,如果飯店的門正好符合他的體型,飯店就能獲得當前的繁榮度。問最大的繁榮度是多少。
大致思路:
這個題目一看就是一個很明顯的動規。對於一個時間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;
}