思路:
其实数学真的不算差,静下心来推一推公式还是比较有希望的,真的是很忌讳上来就觉得是数位dp然后就套模板的做法,尤其是之后套进去只差了一点就不舍得放弃,其实还是应该先想清楚做法再动键盘。
公式:
设:
那么最终答案为:
代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define maxn 100
char temp[100];
long long int p[100],k[500][500];
int n;
long long int C(int x,int y)
{
if(k[x][y]!=-1)return k[x][y];
if(x<0||x>y)return 0;
if(x==0||x==y)return 1;
return k[x][y]=C(x-1,y-1)+C(x,y-1);
}
int main()
{
memset(k,-1,sizeof(k));
while(scanf("%s",temp+1)!=EOF)
{
memset(p,0,sizeof(p));
n=strlen(temp+1);
for(int i=1;i<=n;i++)
{
p[i]=(long long int)(temp[i]-'a'+1);
}
for(int i=0;i<n;i++)
{
if(p[i]>=p[i+1])
{
printf("0\n");return 0;
}
}
long long int ans=0;
for(int i=1;i<n;i++)
{
ans+=C(i,26);
}
for(int i=1;i<=n;i++)
{
for(int j=p[i-1]+1;j<p[i];j++)
{
ans+=C(n-i,26-j);
}
}
printf("%lld\n",ans+1);
}
}