您的位置:首页 > 其它

POJ1036——动态规划

2014-06-24 18:37 267 查看
题目描述:

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

大致思路:

这个题目一看就是一个很明显的动规。对于一个时间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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划 ACM poj