注意非递增的情况
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[11][30];
char s[20];
int length;
int DFS( int pos, int pre, bool statu ){
if( pos >= length ){
return 1;
}
if( !statu && dp[pos][pre] != -1 ){
return dp[pos][pre];
}
int ans = 0;
int endd = statu ? s[pos] - 'a' + 1 : 26;
for( int i = pre + 1; i <= endd; i++ ){
ans += DFS( pos + 1, i, statu && i == endd );
}
return dp[pos][pre] = ans;
}
int main(){
while( scanf( "%s", s ) != EOF ){
length = strlen( s );
int flag = 1;
for( int i = 0; i < length - 1; i++ ){
if( s[i] > s[i+1] ){
flag = 0;
break;
}
}
if( !flag ){
cout << 0 << endl;
continue;
}
memset( dp, -1, sizeof( dp ) );
int ans = DFS( 0, 0, 1 );
for( int i = 0; i < 20; i++ ){
s[i] = 'z';
}
for( length-- ; length > 0; length-- ){
memset( dp, -1, sizeof( dp ) );
ans += DFS( 0, 0, 1 );
}
cout << ans << endl;
}
return 0;
}