poj1850

是因为我好久不刷题了吗,这个题竟然做了俩小时,好几个思路都被推翻

用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;
    }
}
View Code

 

posted @ 2015-01-29 15:45  icodefive  阅读(191)  评论(0编辑  收藏  举报