题解 CF413D 2048
解题思路:
考虑动态规划。
记
若设
然后分情况转移就行了。
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int MOD=1000000007;
int f[2005][(1<<11)+5],m,n,k,x;
int main(){
scanf("%d%d",&n,&k);
m=(1<<k);
f[0][0]=1;
for(int i=1;i<=n;i++){
scanf("%d",&x);
for(int j=0;j<=m;j++){
if(x!=4)f[i][min(m,j+2)]=(f[i][min(m,j+2)]+f[i-1][j])%MOD;//0 或 2
if(x!=2){
if((j>>1)&1==1)f[i][4]=(f[i][4]+f[i-1][j])%MOD;
else f[i][min(m,j+4)]=(f[i][min(m,j+4)]+f[i-1][j])%MOD;
}
}
}
printf("%d",f[n][m]);
return 0;
}