http://162.105.81.212/JudgeOnline/problem?id=1496 写了好几次,调试了很久,发现思路很乱,关电脑整理一下思路,也不难。#include <iostream> using namespace std ; /*list[i]有字符个数不大于i个的字符合法的个数. 以后只要计算str[i] 与 str[i - 1] 之间长度为len - i的合法字符的个数就可以了*/ int sum , list[5] = {0 , 26 , 351 , 2951 , 17901} ;//打表 void Try (int down , int up , int left) { int i ; if (left == 1) { sum += up - down + 1 ; return ; } for (i = down ; i <= up ; i ++) Try (i + 1 , 28 - left , left - 1) ; } int main () { int len , i ; char str[10] ; while (scanf ("%s" , str) != EOF) { len = (int)strlen (str) ; for (i = 1 ; i < len ; i ++)//判断是否为合法字符 if (str[i] <= str[i - 1]) break ; if (i < len) { printf ("0/n") ; continue ; } sum = list[len - 1] ;//字符长度小于len的字符个数 Try (1 , str[0] - 'a' , len) ;//计算字符长度为len且首个字符比str[0]小的字符个数 for (i = 1 ; i < len ; i ++) Try (str[i - 1] - 'a' + 2 , str[i] - 'a' , len - i) ;//计算字符长度为len - i且首个字符比str[i]小比str[i - 1]要大的字符个数 printf ("%d/n" , sum + 1) ; } return 0 ; }