2 条题解
-
1
一世又一世,代码又一遍🎉️ 转呀转,终究绕在了原点🎉️
using namespace std; int c[30][30]; string s; int ans = 0; int main(){ for(int i = 0; i <= 26; i++){ for(int j = 0; j <= i; j++){ if(j == 0) c[i][j] = 1; else c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; } } cin >> s; int len = s.length(); for(int i = 1; i < len; i++){ if(s[i] <= s[i - 1]){ cout << 0; return 0; } } for(int i = 1; i < len; i++) ans += c[26][i]; for(int i = 0; i < len; i++){ int first = 'a'; if(i > 0) first = s[i - 1] + 1; for(int j = first; j < s[i]; j++){ ans += c['z' - j][len - i - 1]; } } cout << ans + 1; return 0; }
-
1
世界上最好的题解😁 【思路】😊 首先从输入中读取需要编码的单词,并获取其长度。 然后,初始化一个字符为‘a’到‘z’的循环,对每一个字符,都生成一个只包含该字符的字符串, 然后以该字符串为起始,进行深度优先搜索(DFS)。 在进行DFS时,首先检查当前字符串的长度,如果长度超过了输入单词的长度,就返回,不再继续搜索。 否则,从当前字符串的最后一个字符的下一个字符开始,生成新的字符串并进行DFS。 然后将生成的字符串插入到对应长度的集合中。 在DFS结束后,从长度为1的集合开始,依次遍历每个集合中的字符串。 当遍历到的字符串等于输入的单词时,输出计数器的值并结束程序。 如果遍历完所有集合都没有找到输入的单词,就输出0。
#include<bits/stdc++.h> using namespace std; string s; int f[30][10],ans,cnt; int main(){ cin>>s; for(int i=1;i<s.size();i++){ if(s[i-1]>=s[i]){ cout<<0; return 0; } } //判断字符串是否合法(升序) for(int i=1;i<=26;i++)f[i][1]=1; //长度为1的字符串数量都是1 for(int j=2;j<=6;j++) for(int i=27-j;i>0;i--) f[i][j]=f[i+1][j-1]+f[i+1][j]; //由公式,我们从上至下从右至左进行计算 for(int j=s.size()-1;j>=0;j--){ cnt++; for(int i=1;i<=s[j]-'a'+1;i++) ans+=f[i][cnt]; } //由以上的思路计算答案 cout<<ans; return 0; }
看完别忘了点赞哟😝
- 1
信息
- ID
- 247
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 7
- 已通过
- 4
- 上传者