题目意思很明了,就是找出字符序列对应的标号,且字符的排列必须是字典序递增!
一开始是用dp,dp[i][j][k],i为首字母,j为长度,k为末字母。但过了许多测试数据后还是wa。最后看了discuss说是可以用组合数学的方法做,也的确简单很多。就是对于一个给定长度L的字符串,找出长度1到L的所有合法的组合情况。然后再减去同等长度下,排位其在后的字符串总数即可,只要用简单的C(n,m)就行了。
以下是我的代码,那个错误的dp代码就不给了,记得foeverlin大神是用dp做的。
- #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char s[30]; - int C(int n,int r)
{
int i,j,s=1;
if(n-r>r) r=n-r;
for(i=0,j=1;i<r;i++)
{
s*=(n-i);
for(;j<=r && s%j==0;++j) s/=j;
}
return s;
} - int main()
{
while(scanf("%s",s)==1)
{
int i,j,k;
bool flag=true;
int ans=0;
int len=strlen(s);
for(i=0;i<len; ++i )
for(k=i+1;k<len;k++)
if(s[i]>=s[k]) {printf("0/n");flag=false;}
if(flag)
{
for(j=1;j<=i;j++) ans+=C(26,j);
for(k=0;s[k];k++) ans-=C(26-(s[k]-'a'+1),i-k);
printf("%d/n",ans);
}
}
return 0;
}