都用的暴力,要是数再大一点呢?1e9的数据呢?所以我练了练手,数位dp一波,嘻嘻嘻(注意签到0的情况哦)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
int l,r;
int a[12],vis[12];
int dp[12][100010];
int dfs(int pos,int sum,int flag,int flag0)
{
if(pos==-1)
return 1;
if(!flag0&&!flag&&dp[pos][sum]!=-1)
return dp[pos][sum];
int up=flag?a[pos]:9;
int ans=0;
for(int i=0;i<=up;i++)
{
if(!flag0)
{
if(i==0)
ans+=dfs(pos-1,sum+1,flag&&i==a[pos],0);
else if(!vis[i])
{
vis[i]=1;
ans+=dfs(pos-1,sum+1,flag&&i==a[pos],1);
vis[i]=0;
}
}
else if(!vis[i])
{
vis[i]=1;
ans+=dfs(pos-1,sum+1,flag&&i==a[pos],1);
vis[i]=0;
}
}
if(!flag&&!flag0)
dp[pos][sum]=ans;
return ans;
}
int solve(int x)
{
memset(vis,0,sizeof(vis));
int pos=0;
while(x>0)
{
a[pos++]=x%10;
x/=10;
}
return dfs(pos-1,0,1,0);
}
int main()
{
int t;
scanf("%d",&t);
memset(dp,-1,sizeof(dp));
while(t--)
{
scanf("%d%d",&l,&r);
printf("%d\n",solve(r)-solve(l-1));
}
return 0;
}
本文通过实战案例介绍了如何使用数位动态规划(数位DP)解决大整数范围内的问题,特别是针对1e9级别的数据处理。文章首先指出暴力求解的局限性,然后详细解释了数位DP的方法,并提供了完整的C++代码实现。通过该方法,可以有效地计算出给定区间内符合条件的整数数量。
9275

被折叠的 条评论
为什么被折叠?



