1 条题解
-
0
这是一个典型的动态规划问题。解题的核心思路是在每个时间点考虑门的不同开启状态,并根据歹徒的到达情况更新最大财富值。
算法标签
动态规划、时间序列规划
题解思路
状态定义:定义一个三维数组 dp[t][s] 来表示在时间 t 时,门的开启状态为 s 时能获得的最大财富值。 初始化:初始时,在时间 0 且门状态为 0 时,最大财富值为 0,即 dp[0][0] = 0,其他状态初始化为负无穷。 状态转移:在每个时间点 t,考虑门状态的变化(开启、关闭或不变),同时检查是否有歹徒在该时间到达且门状态与歹徒强壮程度匹配,若匹配则更新最大财富值。 结果:遍历所有时间点和门的状态,找出最大的财富值。
参考代码(c++)
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> using namespace std; struct node { int ti,val,fat; }hum[110]; int n,big,ti; bool Cmp(node x,node y){return x.ti<y.ti;} void Input() { scanf("%d%d%d",&n,&big,&ti); for(int i=1;i<=n;i++) scanf("%d",&hum[i].ti); for(int i=1;i<=n;i++) scanf("%d",&hum[i].val); for(int i=1;i<=n;i++) scanf("%d",&hum[i].fat); sort(hum+1,hum+n+1,Cmp); } int f[110]; int maxx=0; void Solve() { for(int i=1;i<=n;i++) { f[i]=-1; if(hum[i].ti<hum[i].fat) continue; if(hum[i].fat>big) continue; f[i]=0; for(int j=1;j<i;j++) if(((hum[i].ti-hum[j].ti)>=abs(hum[j].fat-hum[i].fat))) f[i]=max(f[i],f[j]); if(f[i]>=0) f[i]+=hum[i].val; maxx=max(maxx,f[i]); } } void Output() { printf("%d\n",maxx); } int main() { //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); Input(); Solve(); Output(); return 0; }
- 1
信息
- ID
- 37
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者