DP
看到一个超简洁的题解
以下为引用
若将所有情况都一一枚举是不现实的,时间太长了
其实只需由两个即可确定下面的所有格子
因为数字只可能从左上、左、左下来
知道前面的再通过数字就可确定第三个
知道了第三个,再结合第二个,就是下一个数的前两个,同理可一直推下去
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define LL long long
#define MOD 1000000007
#define pi 3.141592653589
using namespace std;
int b[10005],a[10005],ans,n;
int judge()
{
int i;
b[0]=0;
b[n+1]=0;
for(i=1;i<=n;i++)
{
b[i+1]=a[i]-b[i-1]-b[i];
if(b[i+1]>1||b[i+1]<0) return 0;
}
if(b[n+1]==0) return 1;
return 0;
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(b[1]=0;b[1]<2;b[1]++)
ans+=judge();
printf("%d",ans);
return 0;
}