zoukankan      html  css  js  c++  java
  • 【LightOJ

    【链接】https://cn.vjudge.net/problem/LightOJ-1205


    【题意】


    求出L..R范围内的回文个数

    【题解】


    数位DP;
    先求出1..x里面的回文串个数.则做一下前缀和减掉就可以求出L..R之间的了
    dfs(int start,int cur,bool ok,bool xiao){
    其中start表示是从哪一位开始进行扫描的,这个东西用来处理前导0;
    cur表示当前搜索到了第几位数字.
    ok表示当前搜索到的字符串是否为回文.
    xiao则表示是否出现已经搜索的某一位小于所给的数字的对应位,如果有的话,之后的每一位枚举就能一直到9了.
    然后我们可以这样写记搜。
    设f[i][j][k]表示从start位开始搜索,然后当前搜索到第cur位,k=0表示是回文串,k=1表示不是回文串.(当然还没搜完,只能说它可能是回文串)的回文串个数.
    可以肯定,如果xiao==1了,则无论数字是什么,后面的回文串个数都是一样的了
    比如
    所给数字
    9323
    先倒过来
    3239
    假设我们枚举第一位为1
    1xxx
    则这个时候start = 4,cur = 3 (我们是倒过来的),然后因为第一位小于3,所以xiao=1
    则这个时候,后面3个位置,实际上只有第2位是需要枚举的了,因为后面的两位肯定是和前面的两位一样的.
    (而且每一位都可以0..9任意选)
    也就是说,这个时候,答案已经和所给的数字没有任何关系了.
    它是一个通式
    也即这个时候往后算出来的答案f[start][cur][ok],在后序的搜索中如果遇到,是可以直接返回值的.
    (注意只有在xiao==1的时候才能做记搜,因为如果xiao==0,显然之后位是有限制的,可能不是每一位都是0..9了)
    }

    UPD1
    实际上,当ok==0的时候,直接返回0就可以了,不用再继续往下做了。
    (因为再往后做ok也只会等于0)
    这样f数组的第3维就可以省掉了

    【错的次数】


    0

    【反思】


    这种数位DP写成记搜比较好懂>_<

    【代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define ri(x) scanf("%d",&x)
    #define rl(x) scanf("%lld",&x)
    #define rs(x) scanf("%s",x)
    #define oi(x) printf("%d",x)
    #define ol(x) printf("%lld",x)
    #define oc putchar(' ')
    #define os(x) printf(x)
    #define all(x) x.begin(),x.end()
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 100;
    
    
    LL a,b;
    int c[N+10],temp[N+10],dp[N+10][N+10][2];
    
    
    LL dfs(int start,int cur,bool ok,bool xiao){
        if (cur < 1) return ok;
        int limit = (xiao?9:c[cur]);
        if (xiao && dp[start][cur][ok]!=-1)
            return dp[start][cur][ok];
        LL ret = 0;
        rep1(i,0,limit){
            temp[cur] = i;
            if (i == 0 && start == cur){
                ret += dfs(start-1,cur-1,ok,xiao||(i < limit));
            }else
                if (ok && cur < (start+1)/2 + 1)
                    ret += dfs(start,cur-1,temp[start-cur+1]==temp[cur],xiao||(i<limit));
                else
                    ret += dfs(start,cur-1,ok,xiao||(i<limit));
        }
        if (xiao) dp[start][cur][ok] = ret;
        return ret;
    }
    
    
    LL f(LL x){
        if (x < 0) return 0;
        int len = 0;
        while (x){
            c[++len] = x%10;
            x/=10;
        }
        return dfs(len,len,1,0);
    }
    
    
    int main(){
        //Open();
        //Close();
        ms(dp,255);
        int T,kk = 0;
        ri(T);
        while (T--){
            rl(a),rl(b);
            if (a > b) swap(a,b);
            os("Case ");oi(++kk);os(": ");ol(f(b)-f(a-1));puts("");
        }
        return 0;
    }
    


  • 相关阅读:
    mybatis-generator自动生成dao,mapping,model
    cent os 6.5+ambari+HDP集群安装
    cent os 6.5 配置vsftpd
    Ambari修改主页面方法
    Maven .m2 epositoryjdk ools1.7 missing
    Chrome封掉不在chrome商店中的插件解决办法
    Hadoop 读取文件API报错
    Hadoop创建/删除文件夹出错
    mysql性能测试(索引)
    Greys--JVM异常诊断工具
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626103.html
Copyright © 2011-2022 走看看