POJ1036——动态规划
2014-06-24 18:37
267 查看
题目描述:
有一伙人要去饭店,饭店的门可以控制大小,但是每个时间间隔只能开大一个或者关闭一个,每个人有一个肥胖值,到场时间和繁荣度。人在他的到场时间到达饭店,如果饭店的门正好符合他的体型,饭店就能获得当前的繁荣度。问最大的繁荣度是多少。
大致思路:
这个题目一看就是一个很明显的动规。对于一个时间T和一个人P,T时间下S开度的状态只能从0-T-S转移过来,有了这个就有了状态方程。
dp[i] = max(dp[j] + p);其中ti-tj>si-sj。
代码:
有一伙人要去饭店,饭店的门可以控制大小,但是每个时间间隔只能开大一个或者关闭一个,每个人有一个肥胖值,到场时间和繁荣度。人在他的到场时间到达饭店,如果饭店的门正好符合他的体型,饭店就能获得当前的繁荣度。问最大的繁荣度是多少。
大致思路:
这个题目一看就是一个很明显的动规。对于一个时间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; }
相关文章推荐
- POJ 1036 Gangster (动态规划)
- POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法
- HOJ 2124 &POJ 2663Tri Tiling(动态规划)
- 动态规划 poj 2479 1458
- poj 1159(简答动态规划)
- POJ 1661 Help Jimmy -- 动态规划
- POJ 1015 陪审团人选 [动态规划]
- POJ 1036 Rails 模拟堆栈
- poj 1692 Crossed Matchings 动态规划
- poj 1050 To the Max(动态规划处理二维最大子段和)
- POJ1384-动态规划02完全背包
- 【动态规划】poj 3211 washing clothes
- poj 动态规划之1088 滑雪
- poj 1609 Tiling Up Blocks 动态规划
- poj 动态规划总结,在网上找的!!!!
- POJ 1661 HELP JIMMY 动态规划
- poj 1661 Help Jimmy (动态规划)
- 动态规划训练22 [Milking Time POJ - 3616 ]
- poj 1458 小白算法练习 Common Subsequence 动态规划
- 动态规划—北大POJ Charm Bracelet(01背包问题)