题目链接:https://vj.z180.cn/4dae4df90b15954f63832fed332adb87?v=1587179126
题意:T组数据,给你一个数,让你求出,小于这个数的所有ramp number,ramp number定义为从位数从高到低,保持数增加或不变,问有多少个小于n的数:
思路:从最高位dfs,每次遇到满足ramp number的数的时候存下该状态,数位dp下去。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+100;
const int INF=0x3f3f3f3f;
ll dp[maxn][22];
int n,T;
char s[maxn];
ll dfs(int pos,int pre,int fp)
{
if(pos==n)return 1;
if(!fp&&~dp[pos][pre])return dp[pos][pre];
ll ans=0;
int fpmax=fp?s[pos]-'0':9;
for(int i=pre;i<=fpmax;i++)ans+=dfs(pos+1,i,fp&&i==fpmax);
if(!fp)dp[pos][pre]=ans;
return ans;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
n=strlen(s);
int flag=1;
for(int i=1;i<n;i++)
if(s[i]<s[i-1])
{
flag=0;
break;
}
if(!flag)printf("-1\n");
else
{
memset(dp,-1,sizeof(dp));
printf("%lld\n",dfs(0,0,1)-1);
}
}
return 0;
}