Lightoj1122 【数位DP】

题意:

给你m个数,让你在里面挑n个组合,保证位数相差不超过2,求能够组合多少种情况;

思路:

dp[i][j]代表第i个结尾为j的方案数。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

int dp[15][15];
bool vis[15];
int n,m;

int main()
{
    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        memset(dp,0,sizeof(dp));
        memset(vis,0,sizeof(vis));

        scanf("%d%d",&m,&n);
        int x;
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&x);
            vis[x]=1;
        }
        for(int i=1;i<=9;i++)
        {
            if(vis[i])
                dp[1][i]=1;
        }

        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=9;j++)
            {
                if(!vis[j]) continue;
                for(int k=1;k<=9;k++)
                {
                    if(abs(k-j)<=2&&vis[k])
                        dp[i][j]+=dp[i-1][k];
                }
            }
        }
        int ans=0;
        for(int i=1;i<=9;i++)
            if(vis[i])
                ans+=dp[n][i];
        printf("Case %d: %d\n",cas++,ans);
    }
    return 0;
}





posted @ 2016-12-19 18:01  see_you_later  阅读(507)  评论(0编辑  收藏  举报