您的位置:首页 > 产品设计 > UI/UE

UESTC-250-数位dp

2017-05-08 19:50 274 查看
题目大意:求一个区间内有多少个数中相邻数位之差大于等于2;

题目解析::dp的第二维保存上一个数是多少,注意要处理前导零;

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
ll dp[20][12];
int num[20];
int ab(int x,int y)
{
if(x>y) return x-y;
return y-x;
}
ll dfs(int pos,int pre,bool lead,bool limit)
{
if(pos==-1) return 1;
if(!lead&&!limit&&dp[pos][pre]!=-1) return dp[pos][pre];
int u=limit?num[pos]:9;
ll ans=0;
for(int i=0;i<=u;i++)
{
if(lead&&i==0) ans+=dfs(pos-1,-4,lead&&i==0,limit&&i==u);
else if(ab(i,pre)>=2) ans+=dfs(pos-1,i,lead&&i==0,limit&&i==u);
}
if(!lead&&!limit) return dp[pos][pre]=ans;
return ans;
}
ll solve(ll n)
{
ll cnt=0;
while(n)
{
num[cnt++]=n%10;
n/=10;
}
return dfs(cnt-1,-4,true,true);
}
int main()
{
ll a,b;
memset(dp,-1,sizeof(dp));
while(scanf("%lld%lld",&a,&b)!=EOF)
{
printf("%lld\n",solve(b)-solve(a-1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: