zoukankan      html  css  js  c++  java
  • UESTC 250 windy数 数位dp

    题目链接

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define mem1(a) memset(a, -1, sizeof(a))
     4 #define ll long long
     5 int dp[20][20], digit[20], len;
     6 ll dfs(int len, int pre, bool fp, bool first) {     //first表示前面的数是否全部为0, pre是前一个数
     7     if(!len)
     8         return 1;
     9     if(!first&&!fp && dp[len][pre]!=-1)
    10         return dp[len][pre];
    11     int ret = 0, maxx = fp?digit[len]:9;
    12     for(int i = 0; i<=maxx; i++) {
    13         if(!first)
    14             if(abs(i-pre)<2)
    15                 continue;
    16         ret += dfs(len-1, i, fp&&i == maxx, first&&i==0);
    17     }
    18     if(!fp&&!first)
    19         return dp[len][pre] = ret;
    20     return ret;
    21 }
    22 int cal(int n) {
    23     len = 0;
    24     while(n) {
    25         digit[++len] = n%10;
    26         n/=10;
    27     }
    28     return dfs(len, 0, true, true);
    29 }
    30 int main()
    31 {
    32     int a, b;
    33     mem1(dp);
    34     while(~scanf("%d%d", &a, &b)) {
    35         printf("%d
    ", cal(b)-cal(a-1));
    36     }
    37 }
  • 相关阅读:
    2019春第八周作业
    2019春第七周作业
    第六周作业
    币值转换
    打印沙漏
    秋季学期学习总结
    人生影响最大的三位老师
    自我介绍
    2018秋季学习总结
    自己
  • 原文地址:https://www.cnblogs.com/yohaha/p/5035226.html
Copyright © 2011-2022 走看看