zoukankan      html  css  js  c++  java
  • 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
    ",cas++,ans);
        }
        return 0;
    }
    
    
    
    


  • 相关阅读:
    20161115学习笔记
    20161114学习笔记
    微服务
    20161111学习笔记
    20161110学习笔记
    统一ID生成服务
    BlockingQueue原理
    spring常用注解
    Spring 事件发布
    java8 DateUtil工具
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777484.html
Copyright © 2011-2022 走看看