zoukankan      html  css  js  c++  java
  • windy数

    题意:区间内有多少任意两位差不小于2的

    分析:任意两位差不小于2,那么要记录上一位选的是什么,还要注意上一位如果是前缀0的情况,再加一个标记,还要记录前面是否达到上限,然后就ok了

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=35;
     4 
     5 int dp[maxn][maxn],d[maxn];
     6 
     7 int dfs(int len,int num,bool f,bool c){
     8     if(len<0)return 1;
     9     int& tmp=dp[len][num];
    10     if(!f&&tmp!=-1)return tmp;
    11     int ret=0,mx=!f?9:d[len];
    12     for(int i=0;i<=mx;i++){
    13         if(abs(i-num)<2)continue;
    14         int a=i;
    15         if(a==0&&c) a=11;
    16         ret+=dfs(len-1,a,f&&i==mx,c&&i==0);
    17     }
    18     if(!f)tmp=ret;
    19     return ret;
    20 }
    21 
    22 int solve(int x){
    23     int len=0;
    24     while(x>0){
    25         d[len++]=x%10;
    26         x/=10;
    27     }
    28     return dfs(len-1,11,1,1);
    29 }
    30 
    31 int main(){
    32     memset(dp,-1,sizeof(dp));
    33     int x,y;
    34     while(cin>>x>>y)
    35         cout<<solve(y)-solve(x-1)<<endl;
    36     return 0;
    37 }
    View Code
  • 相关阅读:
    网络流 方阵移动
    NOI2019滚粗记
    PKUSC2019游记
    CQOI十二省联考游记
    数学结论题 书堆
    计算几何 大灾变
    51NOD 1773 A国的贸易
    BZOJ 3944
    51Nod 1238
    NOIP2018游记
  • 原文地址:https://www.cnblogs.com/jihe/p/5743836.html
Copyright © 2011-2022 走看看