POJ 1850 Code 字符串 难度:1
题意:
1 如果是严格升序的字母字符串,那么可以输出非0解码,否则不能译码输出0
2 字符串解码 遵循递增原则,其值为 到现在为止的所有按字母序小于该字符串的数量 + 1;
- #include <iostream>
- using namespace std;
- char ans[11];
- int a[10];
- int c[27][27];
- long long f[10];
- void generc(){//生成组合数
- for(int i=1;i<27;i++)c[i][0]=c[i][i]=1;
- for(int i=2;i<27;i++){
- for(int j=1;j<27;j++){
- c[i][j]=c[i-1][j]+c[i-1][j-1];
- }
- }
- }
- void generf(){//如果字符串长度为len ,首先统计长度小于len的所有严格升序字符串个数
- f[0]=0;
- for(int i=1;i<10;i++){
- f[i]=f[i-1]+c[26][i];//长度为i 的 字符串中会出现所有字母,且不重复取到i个后有唯一顺序
- }
- }
- long long calc(){
- int len=0;//记录长度,不想用cstring
- for(len=0;len<10;len++){
- if(ans[len]==0)break;
- a[len]=ans[len]-'a';//习惯处理数字,无关紧要
- }
- int former=0;//记录前一位的值+1,该值将作为下一位所有可能的起点,因为是首位,设存在a[-1]=-1;所以a[0]从0('a')开始
- long long res=0;//记录答案
- res+=f[len-1];//记录所有长度小于len的严格升序字母字符串
- for(int i=0;i<len;i++){//记录所有第i位按字母序小于a[i]的字符串
- for(int j=former;j<a[i];j++){//
- res+=c[25-j][len-1-i];//25-j 可用字母数量 len-1-i 还未确定的字母个数 由于题意保证,不需要加条件判断正确性
- }
- former=a[i]+1;
- }
- return res+1;//只记录了比自己小的字符串所以+1
- }
- bool check(){//检验是否严格升序,没看清题意忘了检验,wa第一次
- int fl=true;
- int len=0;
- char former='a'-1;
- for(len=0;len<10;len++){
- if(ans[len]==0)break;
- if(ans[len]<=former){
- fl=false;
- break;
- }
- former=ans[len];
- }
- if(len==0)return false;//无关紧要
- return fl;
- }
- int main(){
- generc();
- generf();
- cin>>ans;//只有一组数据,wa第二次
- if(check())cout<<calc()<<endl;
- else cout<<0<<endl;
- return 0;
- }
这道题虽然水,但反映了我不读题意的问题,我写的也不好,接下来去找大神题解去
解法2 看了题解后的新想法,dp,但是悲哀的是忘了former的存在//16ms
- #include <iostream>
- using namespace std;
- char ans[11];
- int a[10];
- int len;
- long long memo[11][27];//memo[i][j] i 当前长度 j 以何种字母开头 (j=26相当于所有字母皆可的'X')
- //memo[i][j] 长度<i && 字典序 小于j 的所有严格升序字符串
- void setmemo(){
- //memo[1][0]=0;//a前面没有 符合条件的字符串
- for(int i=1;i<27;i++)memo[1][i]=memo[1][i-1]+1;
- for(int i=2;i<11;i++){
- //memo[i][0]=0;
- for(int j=1;j<26;j++){
- memo[i][j]=memo[i][j-1]+memo[i-1][26]-memo[i-1][j];//所有可能减去小于j的可能
- }
- memo[i][26]=memo[i][25];//任何长度>1的字符串首位必然不是z
- }
- }
- long long calc(){
- long long ans=0;
- for(int i=0;i<len;i++){
- ans+=memo[len-i][a[i]];
- if(i)ans-=memo[len-i][a[i-1]+1];
- ans+=memo[i][26];
- }
- return ans+1;
- }
- bool check(){
- bool fl=true;
- char former='a'-1;
- for(len=0;len<10;len++){
- if(ans[len]==0)break;
- if(ans[len]<=former){
- fl=false;
- break;
- }
- a[len]=ans[len]-'a';
- former=ans[len];
- }
- if(len==0)return false;
- return fl;
- }
- int main(){
- setmemo();
- while(cin>>ans){
- if(check())cout<<calc()<<endl;
- else cout<<0<<endl;}
- return 0;
- }
POJ 1850 Code 字符串 难度:1的更多相关文章
- POJ 1850 Code(组合数)
http://poj.org/problem?id=1850 题意 :给定字符串,系统是用字符串组成的,字符串是按字典序排的.编码系统有三条规则,1这些的单词的长度是由小到大的,2相同长度的按字母在字 ...
- POJ 1850 Code
组合数学.... Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7202 Accepted: 3361 Descrip ...
- poj 1850 code(组合数学)
题目:http://poj.org/problem?id=1850 题意:按给定的规则给字母编号. 一个很简单的题目,但是却做了好久.................................. ...
- POJ 1850 Code(找规律)
Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7913 Accepted: 3709 Description ...
- POJ - 1850 Code(组合数学)
https://vjudge.net/problem/POJ-1850 题意 输出某字符串在字典中的位置.字符串不合规则时输出0. 分析 首先判断字符串合法性,也就是判断是不是升序排列的.如果符合,以 ...
- poj:1850 Code(组合数学?数位dp!)
题目大意:字符的字典序依次递增才是合法的字符串,将字符串依次标号如:a-1 b-2 ... z-26 ab-27 bc-52. 为什么题解都是组合数学的...我觉得数位dp很好写啊(逃 f[pos][ ...
- 【POJ 1850】 Code
[POJ 1850] Code 还是非常想说 数位dp真的非常方便! !. 数位dp真的非常方便!.! 数位dp真的非常方便! !! 重要的事说三遍 该题转换规则跟进制差点儿相同 到z时进一位 如az ...
- POJ 1496 POJ 1850 组合计数
Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8256 Accepted: 3906 Description Tran ...
- POJ 1159 Palindrome(字符串变回文:LCS)
POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...
随机推荐
- Android图形显示之硬件抽象层Gralloc(hal 转)
原文 http://blog.csdn.net/yangwen123/article/details/12192401 FrameBuffer驱动程序分析 文中介绍了Linux系统下的显示驱动框架, ...
- poj2420A Star not a Tree?(模拟退火)
链接 求某一点到其它点距离和最小,求这个和,这个点 为费马点. 做法:模拟退火 #include <iostream> #include<cstdio> #include< ...
- poj1859The Perfect Symmetry
链接 按x或y排序,假如有对称点的话,头尾相对. #include <iostream> #include<cstdio> #include<cstring> #i ...
- 搭建LNMP环境
下载软件包 百度云地址下载地址:http://pan.baidu.com/s/1eSfWNoY 一共有17个包 [root@localhost lnmp]# ls /usr/local/src/lnm ...
- python中的for循环
打印出1到100的数,不包含100 for i in range(1,100): if i==23: print "great,you got your luncky number:&quo ...
- Git基本交互流程图
- 转!!Java 基础面试题的剖析: short s1=1;s1 = s1 +1 报错? s1+=1 呢
short s1=1;s1 = s1 +1会报错吗? package common; public class ShortTypeTest { /* * @param args */ publi ...
- C/C++中的abort、atexit、exit和_Exit
这几个函数都在头文件#include <stdlib.h>中声明.exit._Exit与abort函数使程序终止,控制并不返回到这些函数的调用者. exit()函数 void exit(i ...
- 【vijos1266】搜集环盖
题意 百事任何饮料的瓶盖上都会有一个百事球星的名字. 假设有\(n\)个不同的球星名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢? 分析 设凑齐\(i\)个球星的期望次数为\(f ...
- MySQL DELETE 表别名问题