参考http://blog.csdn.net/jiangzh7/article/details/8731992
这是我做的第四道状压dp入门题,其实只要一下子就懂了思想,但我还是蠢了,看了如上题解才做出,还是得靠自己想啊。
考虑到一个数字能对应到它上方的三个格子,所以我们只需要从它的上一个数字推起即可,这样也保证了它的无后效性。方程以此得出
f[i][j][k][l]=∑f[i-1][h][j][k](h,j,k,l为当前数字的上方的依次四个格子,h在当前数字的上方的前两个格子)
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int a[10005];
int f[10005][2][2][2];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=0;i<=0;i++)
for(int j=0;j<=1;j++)
for(int k=0;k<=1;k++)
if (i+j+k==a[1]) f[1][i][j][k]++;
for(int i=2;i<=n;i++)
for(int j=0;j<=1;j++)
for(int k=0;k<=1;k++)
for(int l=0;l<=1;l++)
for(int h=0;h<=1;h++)
if (j+k+l==a[i]&&h+j+k==a[i-1])
f[i][j][k][l]+=f[i-1][h][j][k];
int ans=0;
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++)
for(int k=0;k<=0;k++)
ans+=f[n][i][j][k];
printf("%d",ans);
return 0;
}