[SCOI2005]扫雷MINE

[SCOI2005]扫雷MINE

https://ac.nowcoder.com/acm/problem/20241

题意:给定一个扫雷得序列,来猜另一个序列,并且当前序列没有雷,比如样例:
1 1 或者 1 1
0 雷 ||||| 雷 0
然后题目要求是问,一共有可能有多少种情况是构成另一个序列
题解:
f[i][0/1][0/1][0/1]
对于第i个位置而言,第i-1,i,i+1个位置是否有雷
所以得到
当a[i]=0时:
图片说明
当a[i]=1时:
图片说明
当a[i]=2时:
图片说明
当a[i]=3时:
图片说明
最后输出最后一位a[i]为几时所对应得答案

# include<iostream>
using namespace std;
int n,tot;
int a[10001];
int f[10001][2][2][2];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
      cin>>a[i];
    f[0][0][0][0]=f[0][0][0][1]=1;
    for(int i=1;i<=n;i++)
      {
          if(!a[i]) f[i][0][0][0]=f[i-1][0][0][0]+f[i-1][1][0][0];
          if(a[i]==1)
          {
              f[i][1][0][0]=f[i-1][0][1][0]+f[i-1][1][1][0];
              f[i][0][1][0]=f[i-1][0][0][1]+f[i-1][1][0][1];
              f[i][0][0][1]=f[i-1][0][0][0]+f[i-1][1][0][0];
        }
        if(a[i]==2)
        {
            f[i][1][1][0]=f[i-1][0][1][1]+f[i-1][1][1][1];
            f[i][1][0][1]=f[i-1][0][1][0]+f[i-1][1][1][0];
            f[i][0][1][1]=f[i-1][0][0][1]+f[i-1][1][0][1];
        }
        if(a[i]==3) f[i][1][1][1]=f[i-1][0][1][1]+f[i-1][1][1][1];
      }
    if(!a[n]) tot=f[n][0][0][0];
    if(a[n]==1) tot=f[n][1][0][0]+f[n][0][1][0];
    if(a[n]==2) tot=f[n][1][1][0];
    cout<<tot;
    return 0;
}

然后还可以压缩掉一维,压缩掉第i-1维,比如我们要计算第i位数,那么第i-2位对于结果时没有关系的
解释:对于第5位而言时4,5,6,同样的几位对于第4位而言是3,4,5,而第3位影响不到第5位
当a[i]=0时:
图片说明
当a[i]=1时:
图片说明
当a[i]=2时:
图片说明
当a[i]=3时:
图片说明
最后输出:图片说明

全部评论

相关推荐

风的叶脉:不知道但我想要鞭打你( '-' )ノ)`-' ) 加油
点赞 评论 收藏
分享
若怜君欢:驾驶证去掉吧,PPT啥的也去掉,本硕课程去掉,导师和研究方向去掉;加入本硕排名(好才写);技能栏加入你会的那些控制算法和滤波算法,这个比你会啥啥啥软件更有用;获奖写上去,奖学金啊,有没有专利啊之类的 电机和硬件这一块,属于传统制造业,制造业实习并不多。多投一些攒攒经验,有实习最好,没有也不需要焦虑(制造业实习其实除了转正,没多大用处) 最后,划重点,等秋招开始后,把你所有社交软件都发一份简历上去,并经常更新,找人内推你!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务