【发布时间】:2014-09-21 03:28:51
【问题描述】:
给定一个长度为 N 的字符串,它只由 0 和 1 组成。但是字符串的某些位置是 '?'。这意味着我们可以放置 0 或 1。
现在,问题是我们需要计算填充这些“?”的方法的数量。位置使得没有 K 0 可以放在一起。
比如我们有长度为 N=4 的字符串,字符串为 0??0
让 K=3 然后在这里我们可以将“0”放在最多两个位置中的一个位置。所以字符串是:
0100
0010
0110
所以这里的答案是 3。现在对于给定的长度为 N 和 K 的字符串,我们需要计算制作这个字符串的方法数。
我的方法:
现在我有 O(N,K) 的方法来使用动态编程来解决这个问题,如果我们将 0 放在第 i 个位置,那么我们可以在“?”的下一个连续段中放置 K-1 个零。如果我们放 1,那么我们可以再放 K 个零。
但是 N 和 K 可能非常大。那么他们的算法是不是更好更高效?
答案之一中提到的代码:
int n,k;
cin>>n>>k;
string s;
cin>>s;
s="#"+s;
int size=s.length();
vector<long long int>F(size+1);
F[0]=1;
for(int i=1;i<=size;i++){
if(s[i]=='R')
{
F[i]=0;
}
else if(s[i]=='L'){
F[i]=1;
}
else{
for(int j=i-1;j>=i-k;j--){
if(j<0)
break;
F[i]=(F[i]+F[j])%MOD;
}
}
}
cout<<F[size]<<"\n";
现在它对于更大的测试用例失败了。但是我在暴力解决方案上运行它并且它不匹配。
测试用例:n=73,k=7 和字符串 s = ???L?R?LLL?L?L?L?LLL???L???RL?????LR?L? LLRL??R???L?RL????RL?R??LL??LLLR?R
答案应该是 877905026。但是代码给出的是 246470268
【问题讨论】:
-
N 和 K 有多大?
-
@PeterdeRivaz 2
-
?的数量是否有限制 -
@PhamTrung 没有。他们没有这样的限制
-
好像是项目欧拉问题?
标签: algorithm