非常报数问题

一只猫喵了个咪 2017-08-20 05:56:38
题目比较清楚,除了包装小摩尔之外,没什么特别的。

题意
摩尔们的整队报数,比较特别。第一个摩尔报数为0,从第二摩尔开始,报数为它前面摩尔报数加1或者减1。
如此这样n个摩尔报数的情况,形成多种数列。譬如,有4个摩尔报数,所有可能的报数数列共有如下8种:
0 1 2 3
0 1 2  1
0 1 0 1
0 1 0 -1
0 -1 0 1
0 -1 0 -1
0 -1 -2 -1
0 -1 -2 -3
对于每一种数列,都有其对应的各项之和。以上8种数列中,对应的和为6、4、2、0、0、-2、-4、-6 。其中和为0的有2种。
现在想知道的是n个摩尔排成一列,按照摩尔报数规则报数,报数形成的数列之和为s的情况有多少种?

输入格式
    共一行,两个正整数,分别为n和s。

输出格式
一个数x,表示n个摩尔报数,共有x种数列之和为s。

输入样例
4  0

输出样例
2

数据规模
0<n<=30

只要你知道画一棵丑陋的大树,然后DFS就行了。
当然,如果数据是20,不用剪枝。
如果数据是30,不用剪枝会爆掉的。
别问我怎么知道的。

附上代码,秒A。
#include<bits/stdc++.h>
using namespace std;
int n,s,i,ans,k;
int t[31],a[31];int x=0;

void dfs(int i,int s)
{
if (i>n)
{
if (s==k)ans++;
return;
}
if (s+(n-i+1)*(2*a[i-1]-1-(n-i+1))/2>k || s+(n-i+1)*(2*a[i-1]+1+(n-i+1))/2<k)return;
a[i]=a[i-1]+1;
dfs(i+1,s+a[i]);
a[i]=a[i-1]-1;
dfs(i+1,s+a[i]);
}

int main()
{
ans=0;
cin>>n>>k;
a[1]=0;
dfs(2,0);
cout<<ans<<endl;
}
...全文
389 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
大米粥哥哥 2017-08-20
  • 打赏
  • 举报
回复
虽然不太懂 但看着很厉害的样子

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧