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
",cse,res);
24     }
25     return 0;
26 }
原文地址:https://www.cnblogs.com/WABoss/p/5134758.html