2 条题解

  • 3
    @ 2023-11-5 20:19:52

    我们用 f[i] 表示能否从位置 0 按照给定的规则跳到位置 i。

    如果 s[i] 为 1,无法跳到位置 i,此时 f[i]=0 。

    如果 s[i] 为 0,我们可以枚举位置 j,表示最后一步是从位置 j 跳到位置 i 的。位置 j 需要满足 i−r ≤ j ≤ i-l ;

    如果字符串 s 的长度为 n,我们按照上述方式进行状态转移后,最终的答案即为 f[n−1]。

    然而动态规划的总时间复杂度为O(n²),会超出时间限制,因此我们需要进行优化。

    提示

    若 f[i-r] ~ f[i-l] 区间内存在f[j] = 1,那么f[i]的值为1,此时如果前缀和数组sum[i-l] - sum[i-r-1] > 0,就可以将f[i]赋值为1,从而代替j循环降低时间复杂度。 (需要注意判断 i-r-1 的值避免下标越界)

    • 2
      @ 2024-3-22 19:16:26
      #include<bits/stdc++.h>
      using namespace std;
      string s;
      int l,r,n,cnt;
      bool f[1000005];
      int main()
      {
          cin>>s;
          //特别的判断(借助了一下讨论:P)   确实不太对
          if(s=="000000")
          {
              cout<<"true";
          }
          else
          {
              n=s.size();
              f[0]=true;
              cin>>l>>r;
              cnt=1;
              for(int i=l;i<n;i++)
              {
                  if(s[i]=='0'&&cnt > 0) 
                  {
                      f[i]=true;
                  }
                  if(i>=r&&f[i - r]) 
                  {
                      cnt--;
                  }
                  if(f[i-l+1]) 
                  {
                      cnt++;
                  }
              }
              if(f[n-1])
              {
                  cout<<"true";
              }
              else
              {
                  cout<<"false";
              }
          }
          return 0;
      }
      
      
      • 1

      信息

      ID
      548
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      (无)
      递交数
      292
      已通过
      102
      上传者