写了特判,WA了第9个点还有救吗
查看原帖
写了特判,WA了第9个点还有救吗
648953
1Stone楼主2022/8/25 16:05
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,f[10005][100],cho[10005],v[10005];
bool vs[10005][100];
ll dfs(int nw,int k)
{
	if(vs[nw][k]&&nw!=n)return f[nw][k];
	vs[nw][k]=1;
	cho[nw]=k;
	if(nw==n)
	{
		int cnt=cho[nw]+cho[nw-1];
		if(cnt!=v[nw])return 0;
		else return 1;
	}	
	else if(nw==1&&n!=1)//考虑本身 
	{
		if(k==1)//猜测这一个是雷 
		{
			if(v[nw]<1||v[nw]>2)return f[nw][k]=0;//分类讨论有几个 
			else if(v[nw]==1)f[nw][k]+=dfs(nw+1,0);
			else if(v[nw]==2)f[nw][k]+=dfs(nw+1,1);
		}
		else if(k==0)//这一格不是 
		{
			if(v[nw]<0||v[nw]>1)return f[nw][k]=0;
			else if(v[nw]==0)f[nw][k]+=dfs(nw+1,0);
			else if(v[nw]==1)f[nw][k]+=dfs(nw+1,1);
		}
	}
	else if(nw>1&&nw<n){//在考虑本身的同时考虑上方 
		int cnt=cho[nw]+cho[nw-1];
		if(cnt==0)
		{
			if(v[nw]<0||v[nw]>1)return f[nw][k]=0;
			else if(v[nw]==0)f[nw][k]+=dfs(nw+1,0);
			else if(v[nw]==1)f[nw][k]+=dfs(nw+1,1);
		}
		else if(cnt==1)
		{
			if(v[nw]<1||v[nw]>2)return f[nw][k]=0;
			else if(v[nw]==1)f[nw][k]+=dfs(nw+1,0);
			else if(v[nw]==2)f[nw][k]+=dfs(nw+1,1);
		}
		else if(cnt==2)
		{
			if(v[nw]<2||v[nw]>3)return f[nw][k]=0;
			else if(v[nw]==2)f[nw][k]+=dfs(nw+1,0);
			else if(v[nw]==3)f[nw][k]+=dfs(nw+1,1);
		}
	}
	return f[nw][k];
} 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>v[i];
	cout<<dfs(1,1)+dfs(1,0);
	
	
	
	return 0;
}
2022/8/25 16:05
加载中...