Lightoj1122 【数位DP】

来源:互联网 发布:蜘蛛侠淘宝客破解版 编辑:程序博客网 时间:2024/06/03 08:19

题意:

给你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;}


0 0
原创粉丝点击