1 条题解

  • 0
    @ 2025-5-8 14:28:16

    这是一个典型的动态规划问题。解题的核心思路是在每个时间点考虑门的不同开启状态,并根据歹徒的到达情况更新最大财富值。

    算法标签

    动态规划、时间序列规划

    题解思路

    状态定义:定义一个三维数组 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
    上传者