zoukankan      html  css  js  c++  java
  • HDU 3652 B-number 数位DP

    题目大意:给出一个数n,求1~n中满足:即含有13(连续),有能被13整除的数的个数.

    题目思路:数位DP,一开始读错题意了,以为13可以不连续……,比较水的数位DP。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<vector>
     5 #include<stdio.h>
     6 #include<stdlib.h>
     7 #include<queue>
     8 #include<math.h>
     9 #include<map>
    10 #define INF 0x3f3f3f3f
    11 #define MAX 1000005
    12 #define Temp 1000000000
    13 
    14 using namespace std;
    15 
    16 int num[20],dp[25][25][25];
    17 
    18 //st==0 前一位不为1
    19 //st==1 前一位为1
    20 //st==2 已含13
    21 
    22 long long dfs(int pos,int st,int limit,long long k)
    23 {
    24     if(pos<0)
    25         return st==2&&k==0;
    26 
    27     if(!limit && dp[pos][st][k]!=-1)
    28         return dp[pos][st][k];
    29     int len=limit?num[pos]:9;
    30     long long ans=0;
    31     for(int i=0;i<=len;i++)
    32     {
    33         long long temp=(k*10+i)%13;
    34         if(st==0 && i==1)
    35             ans+=dfs(pos-1,1,limit&&i==len,temp);
    36         else if(st==0 && i!=1)
    37             ans+=dfs(pos-1,0,limit&&i==len,temp);
    38         else if(st==1 && i==3)
    39             ans+=dfs(pos-1,2,limit&&i==len,temp);
    40         else if(st==1 && i==1)
    41             ans+=dfs(pos-1,1,limit&&i==len,temp);
    42         else if(st==1)
    43             ans+=dfs(pos-1,0,limit&&i==len,temp);
    44         else
    45             ans+=dfs(pos-1,2,limit&&i==len,temp);
    46     }
    47     if(!limit)
    48         dp[pos][st][k]=ans;
    49     return ans;
    50 }
    51 
    52 long long solve(long long a)
    53 {
    54     memset(dp,-1,sizeof(dp));
    55     int len=0;
    56     while(a)
    57     {
    58         num[len++]=a%10;
    59         a/=10;
    60     }
    61     long long ans=dfs(len-1,0,1,0);
    62     return ans;
    63 }
    64 
    65 int main()
    66 {
    67     long long n;
    68     while(scanf("%lld",&n)!=EOF)
    69     {
    70         long long ans=solve(n);
    71         printf("%lld
    ",ans);
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/alan-W/p/5930495.html
Copyright © 2011-2022 走看看