[SCOI2005]扫雷,洛谷之提高历练地,其他数学问题

正文

      第七题:[SCOI2005]扫雷

      这道题有两种做法,一种是递推,一种是贪心。

      先讲Dp,设一个f[i][j][k],表示第i位的当前和下一个的状态。

      那么当s[i]==1 时,f[i][1][0]+=f[i-1][0][1],f[i][0][1]+=f[i-1][0][0],f[i][0][0]+=f[i-1][1][0];

      当s[i]==2 时,状态就可以有三种(选上一个和当前),(选当前和下一个),(选上一个和下一个)

代码

#include
#include
#include

int n;
int s[10010];
int f[10010][2][2];

int main()
{
	scanf("%d",&n);
	f[0][0][0]=f[0][0][1]=1;
	for(int i=1;i<=n;i++)
		scanf("%d",&s[i]);
	for(int i=1;i<=n;i++)
	{
		if(s[i]==0) f[i][0][0]=f[i-1][0][0];
		if(s[i]==1)
		{
			f[i][0][1]+=f[i-1][0][0];
			f[i][1][0]+=f[i-1][0][1];
			f[i][0][0]+=f[i-1][1][0];
		}
		if(s[i]==2)
		{
			f[i][0][1]+=f[i-1][1][0];
			f[i][1][0]+=f[i-1][1][1];
			f[i][1][1]+=f[i-1][0][1];
		}
		if(s[i]==3)
			f[i][1][1]+=f[i-1][1][1];
	}
	printf("%d",f[n][0][0]+f[n][1][0]);
}

贪心就是,我只要知道第一个数是什么,就可以直接知道下一个的状态。

设q[i]=1,,,,q[i]=0;过一遍即可。



你可能感兴趣的:([SCOI2005]扫雷,洛谷之提高历练地,其他数学问题)