zoj 1342 - Word Index

题目:有一个单词表a,..,z,ab,..,yz,...vwxyz,给你一个单词,输出对应的编号。

分析:dp,数学。利用递推统计计数即可知道位置。

状态:F(l,s)代表长度为l的起始为s的元素的个数;

阶段:长度 { 逆向向前拼 };

转移:F(l,s)= sum(F(l-1,t)) { 其中,s < t };

说明:应该可以用数学推出公式的(2011-09-19 11:04)。

#include <stdio.h>
#include <string.h>

int  Count[ 6 ][ 27 ];
char Data[ 6 ];

void makelist( void )
{
    int i,j,k;
    memset( Count, 0, sizeof( Count ) );
    for ( i = 1 ; i <= 26 ; ++ i )
        Count[ 1 ][ i ] = 1;
    for ( i = 2 ; i <=  5 ; ++ i ) {
        for ( j =  1  ; j <= 26 ; ++ j )
        for ( k = j+1 ; k <= 26 ; ++ k )
            Count[ i ][ j ] += Count[ i-1 ][ k ];
    }
}

int calc( int s, int v, int L )
{
    int i,Sum = 0;
    for ( i = s+1 ; i < v ; ++ i )
        Sum += Count[ L ][ i ];
    return Sum;
}

int number( char ch )
{
    return ch-'a'+1;
}

bool legal( int L )
{
    for ( int i = 1 ; i < L ; ++ i )
        if ( Data[ i ] <= Data[ i-1 ] )
            return false;
    return true;
}

int main()
{
    makelist();
    while ( ~scanf("%s",&Data[ 1 ]) ) {
        int Len = strlen( &Data[ 1 ] );

        if ( legal( Len ) ) {
            int i,j,Sum = 1;

            Data[ 0 ] = 'a'-2;//补充循环边界
            for ( i = 1 ; i <= Len ; ++ i )
                Sum += calc( number( Data[ i-1 ] ), number( Data[ i ] ), Len-i+1 );

            for ( i = 1 ; i < Len ; ++ i )
            for ( j = 1 ; j <= 26 ; ++ j )
                Sum += Count[ i ][ j ];

            printf("%d\n",Sum);
        }else printf("0\n");
    }
    return 0;
}
时间: 2024-11-05 19:15:18

zoj 1342 - Word Index的相关文章

ZOJ 1151 Word Reversal反转单词 (string字符串处理)

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=151 For each list of words, output a line with each word reversed without changing the order of the words. This problem contains multiple test cases! The first line of a multiple input is

uva 417 - Word Index(数位dp)

题目连接:uva 417 - Word Index 题目大意:按照题目中的要求,为字符串编号,现在给出字符串,问说编号为多少,注意字符串必须为递增的,否则编号为0. 解题思路:其实就是算说比给定字符串小并且满足递增的串由多少个.dp[i][j]表示第i个位为j满足比给定字符串小并且满足递增的串. dp[i][j]=∑k=0j?1dp[i?1][k]. 注意每次要处理边界的情况,并且最后要加上自身串.并且在处理边界的时候dp[i][0]要被赋值为1,代表前i个为空的情况. #include <cs

UVA 417 - Word Index(数论)

题意:417 - Word Index 题意:每个字符串按题目中那样去映射成一个数字,输入字符串,输出数字 思路:这题还是比较水的,由于一共只有83000多个数字,所以对应一个个数字去映射就可以了,注意字符串进位的情况处理即可 代码: #include <stdio.h> #include <string.h> #include <map> #include <string> using namespace std; char str[10]; map<

HDU Word Index (数位DP)

题意:给你字符串,算出它的数值: a -> 1 b -> 2 . . z -> 26 ab -> 27 ac -> 28 . . az -> 51 bc -> 52 . . vwxyz -> 83681 字母要求递增. #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #incl

zoj 1151 Word Reversal(字符串操作模拟)

题目连接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1151 题目描述: For each list of words, output a line with each word reversed without changing the order of the words. This problem contains multiple test cases! The first line of a multip

POJ1496 Word Index【全排列】

题目链接: http://poj.org/problem?id=1496 题目大意: 和给你一个字符串str,输出str在字典序全排列中的位置(从小到大排列). 解题思路: 和 POJ1850 一模一样. 参考博文:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122771.html先判断str是不是升序序列,如果是升序序列,则为字典序的第1个,输出1. 不符合第一步的话,则分为两步计算str的字典序位置. 先计算比 str 的长

poj1496 Word Index / poj1850 Code(组合数学)

poj1850 Code 题意:输出若干个给定的字符串($length<=10$)在字典序中的位置,字符串中的字母必须严格递增. 读取到非法字符串时,输出“0”,终止程序.(poj1496:继续读取) 我们分成2种情况讨论字典序小于给定字符串的字符串个数 1.长度比给定字符串小 其实长度为$i$的字符串的个数就是$C(26,i)$ 因为我们随机选取$i$个字符后,从小到大依次取出,是可以保证字符串是有序的. 2.长度等于给定字符串 我们枚举每一位,计算从该位开始小于给定字符串的个数,同样可以用组

zoj题目分类

饮水思源---zoj 转载自:http://bbs.sjtu.edu.cn/bbscon,board,ACMICPC,file,M.1084159773.A.html 注:所有不是太难的题都被归成了“简单题”,等到发现的时候已经太晚了,我太死脑筋 了……:( 有些题的程序我找不到了,555……:( SRbGa的题虽然都很经典……但是由于其中的大部分都是我看了oibh上的解题报告后做 的,所以就不写了…… 题目排列顺序没有规律……:( 按照个人感觉,最短路有的算做了DP,有的算做了图论. 有些比较

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive