2017年10月25日提高组T2 数字问题
Description
给出a,b求区间a,b内有多少个数该数的所有子串均不是一个长度大于1的回文串,比如说123是满足条件的224则不满足
Input
第一行:两个整数a,b
Output
一个整数,表示答案
分析:大佬说是数位dp模板那就是吧,记忆化搜索实现。
代码
#include <cstdio>
#include <string>
#include <cstring>
#define ll long long
using namespace std;
ll f[21][20][20][2];
char st[21];
int len;
ll dfs(int n,int x,int y,bool can)
{
if (n>=len) return 1;
if (f[n][x][y][can]!=-1) return f[n][x][y][can];
ll ans=0;
if (can)
{
for (int i=0;i<10;i++)
if (i!=x&&i!=y) ans+=dfs(n+1,y,i,true);
}
else
{
int max=st[n]-'0';
for (int i=0;i<max;i++)
if (i!=x&&i!=y) ans+=dfs(n+1,y,i,true);
if (max!=x&&max!=y) ans+=dfs(n+1,y,max,false);
}
return f[n][x][y][can]=ans;;
}
ll sum(ll x)
{
if (x<0) return 0;
sprintf(st,"%lld",x);
len=strlen(st);
int j=st[0]-'0';
ll ans=1;
memset(f,-1,sizeof(f));
for (int i=1;i<=j;i++)
ans+=dfs(1,i,i,i!=j);
for (int k=2;k<=len;k++)
for (int i=1;i<10;i++)
ans+=dfs(k,i,i,true);
return ans;
}
int main()
{
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld",sum(r)-sum(l-1));
}