| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
写了个数位dp,还是超时,这个数据到底有几组阿?RT
我的代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
ll f[20][10][20][3];
ll l,r;
int n,a[20],b[20];
ll dfs(int k,int x,int sum,int flag) //位数 当前数 0的数量 借位标记
{
if(k==n)
{
if(flag==2) return 0;
return sum;
}
if(f[k][x][sum][flag]!=-1) return f[k][x][sum][flag];
ll s=sum;
for(int i=0;i<=9;i++)
if(flag==0||flag==2)
s=s+dfs(k+1,i,sum+(i==0),flag);
else
{
int Next;
if(i<a[k+1]) Next=0;
if(i==a[k+1]) Next=1;
if(i>a[k+1]) Next=2;
s=s+dfs(k+1,i,sum+(i==0),Next);
}
return f[k][x][sum][flag]=s;
}
ll solve(ll x)
{
if(x<=0) return x;
n=0;
while(x>0)
{
n++;
a[n]=x%10;
x=x/10;
}
for(int i=1;i<=n;i++) b[n-i+1]=a[i];
for(int i=1;i<=n;i++) a[i]=b[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=9;j++)
for(int k=0;k<=n;k++)
for(int t=0;t<=2;t++) f[i][j][k][t]=-1;
ll res=0;
int flag;
for(int i=1;i<=9;i++)
{
if(i<a[1]) flag=0;
if(i==a[1]) flag=1;
if(i>a[1]) flag=2;
res=res+dfs(1,i,0,flag);
}
return res;
}
int main()
{
while(1)
{
scanf("%lld%lld",&l,&r);
if(l<0||r<0) break;
if(l>r) swap(l,r);
printf("%lld\n",solve(r)-solve(l-1));
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator