题意:把一个序列任意分段,保证每一段数的和是1,共有多少种分法
这道题贼简单啊,一看到题目就想dp,想复杂了.
这道题可以分段看,
比如 1 0 0 1 0 1,这个序列共有多少种分法,其实只能在每两个1之间的0那里分,比如前两个1中间有两个0,他就有3种分发 10|01 ,1|001,100|1,后两个1中间有1个0,有两种分法,1|01,10|1,前两个1和后两个1在分的时候是互不影响的,因为他们都被0隔开,前面或后面多任意多个0,和还是1.所以其实就是求出每两个1之间有几个0,然后把(每段0的个数+1)乘起来.
需要注意的是如果序列全是0,结果也是0.
#include<bits/stdc++.h>
using namespace std;
int n,a[200];
int main(){
cin>>n;
int t = 0;
for(int i = 1;i <= n;i++)
{ int x;
scanf("%d",&x);
if(x==1)
{
a[++t] = i;
}
}
if(t==0) {
cout<<0<<endl;
return 0;
}
long long sum = 1;
for(int i = 2;i <= t;i++)
sum*=a[i]-a[i-1];
cout<<sum<<endl;
}
这么简单的思路为什么一开始没有想到…