LibreOJ 2683 「BalticOI 2013」非回文数 发表于 2019.07.05 | 分类于 题解 | 16 这不和萌数那题一样的吗…… 显然只要没有长度为 2,3 的回文子串就可以了,数位 DP 记录上一位和上上位和这两位是否为前导零。 代码: 1234567891011121314151617181920212223242526272829303132333435#include <cstdio>#include <cstring>using namespace std;const int LEN = 18;long long l,r;int d[LEN + 5],tot;long long f[LEN + 5][10][10][2][2];long long dfs(int x,int num,int pre,int lead,int prelead,int top){ if(!x) return 1; if(!top && ~f[x][num][pre][lead][prelead]) return f[x][num][pre][lead][prelead]; long long ret = 0; int bound = top ? d[x] : 9; for(register int i = 0;i <= bound;++i) if((lead || i != num) && (prelead || i != pre)) ret += dfs(x - 1,i,num,lead && !i,lead,top && i == bound); if(!top) f[x][num][pre][lead][prelead] = ret; return ret;}long long solve(long long n){ tot = 0; for(;n;n /= 10) d[++tot] = n % 10; return dfs(tot,0,0,1,1,1);}int main(){ memset(f,-1,sizeof f); scanf("%lld%lld",&l,&r); printf("%lld\n",solve(r) - solve(l - 1));} 本文作者: Alpha1022 本文链接: https://www.alpha1022.me/articles/loj-2683.htm 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!