POJ1850

news/2025/2/21 23:43:36/

题目链接:https://vjudge.net/problem/POJ-1850

AC思路:

  可以把一个字符串S(设其长度为len) 所对应的数字看成排在其前面的所有字符串的个数加一。

  对于S,排在其前面的字符串可以分成两类:

  1、长度小于len 的所有字符串;

  2、长度等于len 并且排在S前面的字符串。

  对于第1类,我们可以先推出求长度为 t 的所有字符串的个数的公式:其实对于构造一个长度为 t 的字符串,就是从26个字母中取出 t 个字母,由于一定要升序排列,故该字符串在字母取出的同时便被确定了。所以, 长度为 t 的所有字符串的个数 = C(26,t)。有了这条公式,第一类字符串的总个数就不难求出了。

  对于第2类,我们可以从头到尾遍历S,对于每一个位置 i,尝试放置大于S[i-1](如果是第一位则从 ‘a' 取起)且小于S[i] 的字母,由于在位置 i 的字母已经放置了(设为C),则其后可以出现的字母数便为       ’z'-C,我们需要从这 'z'-C 个字母中取出 len-i-1 个来填满位置 i 之后的所有位置,由于有了求第1类的经验,我们已经知道:“字符串在字母取出的同时便被确定了”,故只需在代表答案的 ans 变量上加上组合数 C['z'-ch][len-i-1] 就可以了。

  至于求组合数的方法,上次好像已经提到过了,就是做POJ3252的时候好像已经提到过了,就是利用公式 C(i,j)=C(i-1,j-1)+C(i-1,j),打表即可。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int C[30][30];
 6 void init(){
 7     C[0][0]=0;
 8     C[1][0]=C[1][1]=1;
 9     for(int i=2;i<30;i++){//qian
10         C[i][0]=C[i][i]=1;
11         for(int j=1;j<i;j++)
12             C[i][j]=C[i-1][j-1]+C[i-1][j];
13     }
14 }
15 int main(){
16     init();
17     char word[14];
18     scanf("%s",word);
19     int len=strlen(word);
20     for(int i=1;i<len;i++){
21         if(word[i]<=word[i-1]){
22             printf("0\n");
23             return 0;
24         }
25     }
26     long long ans=1;
27     for(int i=1;i<len;i++)
28         ans+=C[26][i];
29     for(int i=0;i<len;i++){
30         char ch;
31         if(!i)  ch='a';
32         else    ch=word[i-1]+1; 
33 
34         while(ch<word[i]){
35             ans+=C['z'-ch][len-i-1];
36             ch++;
37         }
38     }
39     printf("%d\n",ans);
40     return 0;
41 }
View Code

 

 

 

思路参考于大神博客:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122760.html

大神的思路跟我的不太一样,但给了我很多启发。感谢!

转载于:https://www.cnblogs.com/Blogggggg/p/7231366.html


http://www.ppmy.cn/news/690072.html

相关文章

GD32 汽车诊断协议 J1850-VPW 测试

J1850-VPW 硬件说明:  MCU: GD32C103 120M,128K,32k RAM.  输入:USB 5V.  OBD功能口定义:OBD(2,10)VPWM、OBD 7(K线)、OBD 6(CAN H)、OBD 14(CAN L)、OBD 15(L线). 软件说明: 一、汽车CAN2.0(双线OBD 6、14) 1、支持波特率:1M、800K、500K、250K、125K、100K、62K、50…

DELL 1850 产品简介

DELL 1850 使用的芯片是 Intel 1.处理器 32&64T 兼容 2.远程管理(可以进行远程安装软件,但要求在同一个局域网内,不能通过公网中转完成远程安装) SC1420 是dell 入门级产品,最多2个cpu 1800 ,1850 是戴尔的主要产品, 2800,2850 要比 1800,1850 扩展性好 185…

H3C(s1850)初始化配置流程

H3C&#xff08;s1850&#xff09;初始化配置流程 1.配置时间 clock datetime HH:MM:SS YYYY/MM/DD clock timezone bj add 8 2.配置交换机名称 sysname 3.关闭console登录认证 user-interface aux 0 authentication-mode none 4.开启Telnet服务 service telnet enable 5.配置…

如何去除PDF有权限密码

如何在线解密、找回PDF密码、去除PDF密码&#xff1f;具体步骤如下&#xff1a; 1. 首先&#xff0c;在百度搜索框中输入“密码帝官网”。 2. 在搜索结果中&#xff0c;点击“密码帝官网”并进入官方网站。 3. 找到并点击“立即开始”按钮&#xff0c;进入用户中心。 4. 在用…

亚马逊实践 | 构建可持续发展的架构模型

可持续发展概念源于对系统性文明危机和世界问题的科学和社会意识形态研究。世界级的进步学术社群和政治精英在二十世纪末就认识到了这些问题的存在。他们将即将到来的二十一世纪视为充满不确定性、全球灾难进程逐步升级的时代。可持续发展对多个领域产生影响&#xff0c;目前已…

Android Studio 打开Profiler后App闪退

Android Studio 打开Profiler后App闪退 环境 Android Studio 4.1.1 Android 10 错误信息&#xff1a; 2020-12-24 16:06:21.870 3001-3001/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 2020-12-24 16:06:21.870 3001-3001/? A/DEBUG: B…

hackmyvm入门(靶机网络配置)

hackmyvm概述hackmyvm靶机下载地址靶机网络配置测试环境环境搭建 愉快玩耍 hackmyvm概述 hackmyvm是一个平台&#xff0c;包含了大量靶机&#xff0c;类似于vulnhub、hackthebox等平台&#xff0c;你可以在上面下载靶机&#xff0c;进行渗透测试练习&#xff0c;非常适合热爱黑…

SQL数据库指令--SELECT 语句

SQL数据库指令--SELECT 语句  SELECT 语句用来检索数据表中的数据,而哪些数据被检索,是由列出的数据行和语句中的 WHERE 子句决定。 (SQL指令不区分大小写,SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。) 句式:SELECT 字段…