华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2640|回复: 9
打印 上一主题 下一主题

炸弹坑问题

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-6-2 18:59:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一排有n个坑,每个坑都可以放炸弹,但是不可以连续m个坑放炸弹,输入n和m,请问有多少种放炸弹的方法。
回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
沙发
 楼主| 发表于 2018-6-2 19:01:38 | 只看该作者
显然可以用dfs来做,枚举每个坑是放炸弹还是不放,用s表示当前这一列的连续炸弹数目,要是这个坑不放炸弹,就归0了,这样除了复杂度高点之外,显然是可以出结果的。
回复 支持 反对

使用道具 举报

9

主题

89

帖子

292

积分

华一学生

积分
292
板凳
发表于 2018-7-27 20:07:20 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n,m,ans=0,a[10010];
  4. void dfs(int x)
  5. {
  6.     if (x>=n+1)
  7.     {
  8.         int s=0;
  9.         for (int i=1;i<=n;i++)
  10.         {
  11.             if (a[i]==1) s++;
  12.             else s=0;
  13.             if (s>=m) return;
  14.         }
  15.         ans++;
  16.         return;
  17.     }
  18.     a[x]=1;
  19.     dfs(x+1);
  20.     a[x]=0;
  21.     dfs(x+1);
  22. }
  23. int main()
  24. {
  25.     cin>>n>>m;
  26.     dfs(1);
  27.     cout<<ans;
  28.     return 0;
  29. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

89

帖子

292

积分

华一学生

积分
292
地板
发表于 2018-7-27 20:07:43 | 只看该作者
全排列 再判断
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
5#
发表于 2018-7-27 20:29:45 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n,m,ans,a[101],cnt;
  4. void ms(int i,int x)
  5. {
  6.     if(i>n)ans++;
  7.     else
  8.     {
  9.         if(x+1<m)
  10.         {
  11.             a[i]=1;
  12.             ms(i+1,x+1);
  13.             a[i]=0;
  14.         }
  15.         ms(i+1,0);
  16.     }
  17. }
  18. int main()
  19. {
  20.     cin>>n>>m;
  21.     ms(1,0);
  22.     cout<<ans;
  23.     return 0;
  24. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
6#
 楼主| 发表于 2018-7-27 23:12:27 | 只看该作者
这个题可以用递推来做的 。
回复 支持 反对

使用道具 举报

0

主题

31

帖子

94

积分

注册会员

Rank: 2

积分
94
7#
发表于 2018-7-30 00:32:08 | 只看该作者
  1. #include<cstdio>
  2. int n,m;
  3. int sum=0;
  4. int book[10001];
  5. void dfs(int step,int x)
  6. {
  7.         if(step==m)
  8.         {
  9.                 return;
  10.         }
  11.         else
  12.         {
  13.                 if(x==n+1)
  14.                 {
  15.                         sum++;
  16.                         return;
  17.                 }
  18.         }
  19.         dfs(0,x+1);
  20.         dfs(step+1,x+1);
  21. }
  22. int main()
  23. {
  24.         scanf("%d%d",&n,&m);
  25.         book[1]=1;
  26.         dfs(0,1);
  27.         printf("%d",sum);
  28.         return 0;
  29. }
复制代码
回复 支持 反对

使用道具 举报

0

主题

31

帖子

94

积分

注册会员

Rank: 2

积分
94
8#
发表于 2018-7-30 00:35:59 | 只看该作者
话说我总觉得这题有什么数学公式,但是想不出来,动态规划的话应该就是和‘拖拉机’纸牌游戏一样讨论放与不放写两个类似于数学推倒的关系式,但是写完暴搜好晚了。总感觉上面递推大佬的式子有点奇怪,不知道是自己太蒟蒻了还是真的有问题。
回复 支持 反对

使用道具 举报

0

主题

31

帖子

94

积分

注册会员

Rank: 2

积分
94
9#
发表于 2018-7-30 00:39:51 | 只看该作者

喵?book数组好像没有用到啊……好尴尬啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 06:22 , Processed in 0.107195 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表