题意:有m个个位数(0-9)要求组成n位数(1<=m<10,1<=n<=10),使得相邻两位之间的差值得绝对值小于2,输出这种数的个数。
解决办法:
由于数的范围很小,直接暴力可以解决,也可以dp~~~~
dp[i][j] 表示长度为i的数的第i位是j,当前的方案数目为dp[i][j];
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define maxn 11
int dp[maxn][maxn];
int a[maxn];
int n,m;
int main()
{
int T,x;
scanf("%d",&T);
for(int ncase=1;ncase<=T;ncase++){
scanf("%d %d",&m,&n);
memset(a,0,sizeof(a));
for(int i=0;i<m;i++){
scanf("%d",&x);
a[x]=1;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<=9;i++)
if(a[i]) dp[1][i]=1;
for(int i=2;i<=n;i++)
for(int j=0;j<=9;j++){
if(a[j]) dp[i][j]=0;
for(int k=0;k<=9;k++)
if(a[k] && abs(k-j)<=2)
dp[i][j]+=dp[i-1][k];
}
int ans=0;
for(int i=0;i<=9;i++){
if(a[i])
ans+=dp[n][i];
}
printf("Case %d: %d\n",ncase,ans);
}
return 0;
}