UESTC 1307 windy数(数位DP)

时间:2025-04-16 08:03:49

题目链接

这其实入门题,不过,我写了好一会,还是一直wa,图样。。。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <ctime>
#include<sstream>
#include <cmath>
#include <algorithm>
using namespace std;
int dp[][],sum[];
int judge(int x)
{
int num[],i,j,n = ,pre;
int ans = ;
if(x == )
return ;
while(x)
{
num[n++] = x%;
x /= ;
}
if(n == )
{
return num[] + ;
}
for(i = ;i < n;i ++)
{
for(j = ;j < ;j ++)
ans += dp[i][j];
}
ans ++;
for(i = ;i < num[n-];i ++)
{
ans += dp[n][i];
}
pre = num[n-];
for(i = n-; i >= ; i --)
{
if(i == )
{
for(j = ; j <= num[i]; j ++)
{
if(max(j,pre)-min(j,pre) >= )
ans ++;
}
break;
}
for(j = ; j < num[i]; j ++)
{
if(max(j,pre)-min(j,pre) >= )
{
ans += dp[i+][j];
}
}
if(max(num[i],pre)-min(num[i],pre) < ) break;
pre = num[i];
}
return ans;
} int main()
{
int i,j,k,x,y;
for(i = ; i < ; i ++)
dp[][i] = ;
for(i = ; i <= ; i ++)
{
for(j = ; j < ; j ++)
{
for(k = ; k < ; k ++)
{
if(max(j,k)-min(j,k) >= )
{
dp[i][j] += dp[i-][k];
}
}
}
}
while(scanf("%d%d",&x,&y)!=EOF)
{
printf("%d\n",judge(y)-judge(x-));
}
return ;
}