BZOJ 1088 扫雷Mine (递推)

题解:如果确定了第一排前两个数,那么剩下的数是唯一确定的,所以只要分情况讨论即可。

#include <cstdio>
#include <cstring>
int n,a[10010],s[10010];
int ans(int x){
    memset(a,0,sizeof a);
    if(x==1)a[1]=1;
    if(x==2)a[2]=1;
    if(x==3)a[1]=a[2]=1;
    for(int i=2;i<=n-1;i++){
        a[i+1]=s[i]-a[i]-a[i-1];
        if(a[i+1]<0)return 0;
    }return s[n]-a[n-1]-a[n]==0;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&s[i]);
    if(s[1]==0)printf("%d\n",ans(0));
    else if(s[1]==1)printf("%d\n",ans(1)+ans(2));
    else printf("%d",ans(3));
    return 0;
}

BZOJ 1088 扫雷Mine (递推)

时间: 2024-11-05 22:07:45

BZOJ 1088 扫雷Mine (递推)的相关文章

BZOJ 1088 扫雷Mine

       这道题纯粹吓人的,看完题发现总共就两列,最开始想一个个进行枚举,发现费时费力还过不了,后来仔细一看,只要枚举前两个格子的四种情况后面的就全出来了,中间加个判断不符合减一就行了,结果绝对小于等于4.        代码如下: #include<iostream> #include<cstdlib> #include<cstdio> using namespace std; int i_long; int i_nob[10000]; int i_lei[100

Luogu P2327 [SCOI2005]扫雷【递推/数学】By cellur925

题目传送门 推了好久啊.看来以后要多玩扫雷了qwq. 其实本题只有三种答案:0.1.2. 对于所有第一列,只要第一个数和第二个数确定后,其实整个数列就确定了,我们可以通过这个递推式得出 1 sec[i-1]=fir[i]+fir[i-2]+fir[i-1] 所以我们可以枚举每列的第1/2个数. 如果推到第n+1个数还存在,那么指定这种情况不成立. Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring&

BZOJ 1088 扫雷

此题为四川省选. 其实我们发现只要确定了前两个格子的雷的情况,剩下的皆可递推出来. 那么枚举前两个(一个?)格子的状态,然后判断最后第(n+1)个格子是否符合要求(=0)即可. 比较好想吧....注意把循环的上界换成min(1,a[1])依旧可过. #include<iostream>#include<cstdio>#include<cstring>#include<cmath>#define maxn 10005using namespace std;in

BZOJ 1002 FJOI2007 轮状病毒 递推+高精度

题目大意:轮状病毒基定义如图.求有多少n轮状病毒 这个递推实在是不会--所以我选择了打表找规律 首先执行下面程序 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 110 using namespace std; struct abcd{ int to,next; bool ban; }table[M<<2]; int head[

BZOJ 1002: [FJOI2007]轮状病毒 递推/基尔霍夫矩阵树定理

f[n]=3*f[n-1]-f[n-2]+2 1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2959  Solved: 1644 [Submit][Status][Discuss] Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Outpu

【BZOJ】1088: [SCOI2005]扫雷Mine(递推)

http://www.lydsy.com/JudgeOnline/problem.php?id=1088 脑残去想递推去了... 对于每一个第二列的格子,考虑多种情况,然后转移.....QAQ 空间可以降到O(1)...我就不优化了.. 至于题解说的枚举第一行...orz完全想不到. 做法就是:(好麻烦,不说了...就是对应三个格子的状态然后转移 #include <cstdio> #include <cstring> #include <cmath> #include

Bzoj 1088: [SCOI2005]扫雷Mine (DP)

Bzoj 1088: [SCOI2005]扫雷Mine 怒写一发,算不上DP的游戏题 知道了前\(i-1\)项,第\(i\)项会被第二列的第\(i-1\)得知 设\(f[i]\)为第一列的第\(i\)行位置是否有雷,有雷的话,\(f[i] = 1\),无雷\(f[i] = 0\) \(a[i]\)就是题目读入的东西. 那么转移方程就是\(f[i] = a[i - 1] - f[i - 1] - f[i - 2]\) 不满足限制的时候就是\(f[i] < 0\) 或者$ f[i] > 1$ 第一

[BZOJ 1088][SCOI2005]扫雷Mine

Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案. Input 第一行为N,第二行有N个数,依次为第二列的格

BZOJ 1088: [SCOI2005]扫雷Mine 枚举

枚举前两位,递推剩下的 1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1832  Solved: 1090 [Submit][Status][Discuss] Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8