CF 617B Chocolate

题意:把一个序列任意分段,保证每一段数的和是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;
}

这么简单的思路为什么一开始没有想到…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值