LightOJ1122 Digit Count(DP)
dp[i][j]表示长度i末尾为S[j]的方案数
dp[1][0...m-1]=1
dp[i][j]=∑dp[i-1][k] (|S[k]-S[j]|<=2)
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 using namespace std; 5 int d[11][11]; 6 int main(){ 7 int t,n,m,a[11]; 8 scanf("%d",&t); 9 for(int cse=1; cse<=t; ++cse){ 10 scanf("%d%d",&n,&m); 11 for(int i=0; i<n; ++i) scanf("%d",a+i); 12 memset(d,0,sizeof(d)); 13 for(int i=0; i<n; ++i) d[1][i]=1; 14 for(int i=2; i<=m; ++i){ 15 for(int j=0; j<n; ++j){ 16 for(int k=0; k<n; ++k){ 17 if(abs(a[j]-a[k])<=2) d[i][j]+=d[i-1][k]; 18 } 19 } 20 } 21 int res=0; 22 for(int i=0; i<n; ++i) res+=d[m][i]; 23 printf("Case %d: %d\n",cse,res); 24 } 25 return 0; 26 }