是因为我好久不刷题了吗,这个题竟然做了俩小时,好几个思路都被推翻
用dp数组预处理出范围是a->a+x字符y长度有多少种递增串
然后例如def首先求a__有多少种情况那么自然后面就是只有b即dp[2][25],再求b__的情况c__,ab__,ac__.......
然后求字符串长度小于输入长度的情况

#include<iostream> #include<string.h> #include<stdio.h> using namespace std; const int maxa = 100; char str[maxa]; int dp[10][30]; int main(){ for(int i = 0; i < 10; i++){ for(int k = 0; k <= 26; k++){ if(i == 0) dp[i][k] = 1; else for(int j = 0; j < k; j++)dp[i][k] += dp[i-1][j]; /// cout<<dp[i][k]<<" "; } //puts(""); } char str[12]; while(scanf("%s", str)!=EOF){ int ok = 0; for(int i = 1; str[i]; i++){ if(str[i] <= str[i-1]) ok = 1; } if(ok){ cout<<0<<endl;continue; } int n = strlen(str); int ans = 1; for(int i = 0; str[i]; i++){ for(int k =i == 0?0:str[i-1]-'a'+1; k < str[i]-'a'; k++){ ans += dp[n-1-i][25-k]; } } int m = 26; //cout<<ans<<endl; for(int i = 0; i < n-1; i++){ ans += dp[i+1][25+1]; } cout<<ans<<endl; } }