题意:

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的更多相关文章

  1. POJ 1850 Code(组合数)

    http://poj.org/problem?id=1850 题意 :给定字符串,系统是用字符串组成的,字符串是按字典序排的.编码系统有三条规则,1这些的单词的长度是由小到大的,2相同长度的按字母在字 ...

  2. POJ 1850 Code

    组合数学.... Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7202 Accepted: 3361 Descrip ...

  3. poj 1850 code(组合数学)

    题目:http://poj.org/problem?id=1850 题意:按给定的规则给字母编号. 一个很简单的题目,但是却做了好久.................................. ...

  4. POJ 1850 Code(找规律)

    Code Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7913   Accepted: 3709 Description ...

  5. POJ - 1850 Code(组合数学)

    https://vjudge.net/problem/POJ-1850 题意 输出某字符串在字典中的位置.字符串不合规则时输出0. 分析 首先判断字符串合法性,也就是判断是不是升序排列的.如果符合,以 ...

  6. poj:1850 Code(组合数学?数位dp!)

    题目大意:字符的字典序依次递增才是合法的字符串,将字符串依次标号如:a-1 b-2 ... z-26 ab-27 bc-52. 为什么题解都是组合数学的...我觉得数位dp很好写啊(逃 f[pos][ ...

  7. 【POJ 1850】 Code

    [POJ 1850] Code 还是非常想说 数位dp真的非常方便! !. 数位dp真的非常方便!.! 数位dp真的非常方便! !! 重要的事说三遍 该题转换规则跟进制差点儿相同 到z时进一位 如az ...

  8. POJ 1496 POJ 1850 组合计数

    Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8256 Accepted: 3906 Description Tran ...

  9. POJ 1159 Palindrome(字符串变回文:LCS)

    POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...

随机推荐

  1. [转载] DevOps年中盘点:国外最受欢迎的10篇技术文章

    本文根据高效运维系列微信群的群友投稿整理而成.“高效运维”公众号作为本系列群的官方唯一公众号,原创并独家首发. 欢迎关注“高效运维”公众号,以免费参加「运维讲坛」每月一次的线下交流活动:并抢先赏阅干货 ...

  2. ORACLE性能优化之SQL语句优化

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   操作环境:AIX +11g+PLSQL 包含以下内容: 1.  SQL语句执行过程 2.  优化器及执行计划 3.  合 ...

  3. (三)主控板生级uboot与内核

    一.升级uboot 把我的电脑增加一个192.168.1.3的ip,方便升级boot. 1.连接串口,连接网口到GE1; 2.登陆电脑后到D:\MTG3000MAIN\first目录打开tftp32 ...

  4. Android提高篇之自定义dialog实现processDialog“正在加载”效果、使用Animation实现图片旋转

     知识点: 1.使用imageview.textview自定义dialog 2.使用Animation实现图片旋转动画效果 3.通过自定义theme去掉dialog的title 没有使用progres ...

  5. Mybatis 的分页插件PageHelper-4.1.1的使用

    Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper  文档地址:http://git.oschin ...

  6. (Clob的写入和读取-java)更新数据库报错:SQL Error: 1461, SQLState: 72000 ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

    原 因:某一个字段本为varchar2(1024),但是实际要插入的值超过varchar2允许的最大长度4000时,oracle自动将该字段值转化为Long类型,然后提示插入操作失败. 解决办法: 1 ...

  7. grade web的构建约定 convention

    --2015.09.24 当使用gradle构建web应用时: src/main/javasrc/main/resourcessrc/main/webapp/resourcessrc/main/web ...

  8. LF will be replaced by CRLF in git add

    git add 出现这样的提示: LF will be replaced by CRLF in qinqiu.txt. 这个时候要: $ rm -rf .git  // 删除.git $ git co ...

  9. ios开发者证书 签发者无效

    2月14日以后,由于苹果更新安全证书:会导致本机制作的所有开发者证书无效: 钥匙串里的开发者证书无法使用 解决方式: 重新下载苹果公司的安全证书,并安装 1: 先在钥匙串里搜索到老的证书,如果有,请先 ...

  10. iconv 文件编码相互转换

    iconv 文件编码相互转换 示例: iconv -f utf-8 -t gbk ~/a.txt > ~/b.txt -f 从哪种格式转换 -t 要转换到哪种格式 a.txt要转换的文件 b.t ...