2 条题解
-
3
我们用 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
#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
- 上传者