zoukankan      html  css  js  c++  java
  • 字串数字《蓝桥杯2019初赛》

    题目:结果为: 3725573269

    我有两种解法:

    第一种:常规解法(模拟)。该解法时间太长,只能解比较短的字母串。

    第二种:数位遍历 (没加dp,哎,实力问题) (最近,刚好自己在学位数dp入门,突然想到,没有基础的可以去另外学习)

    如果有其他解法和错误,兄弟些请留下链接和意见。

    第一种:直接上代码,代码里有个别说明的会在旁边加上注解

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <vector>
    
    #define ll long long
    
    using namespace std;
    
    ll method1(const string tar) {
        string s = "A";
        if (tar == "A") return 1; 
        for (ll i = 2;; i++) {
            int j = 0; // 表示进位 
            int k;
            // 模拟 
            // 这里可以按十进制加1满10进1的想法来做 
            // 不过这里是满'Z'加1 
            for (k = s.size()-1,s[k]++/*在最后一位加1*/; k >= 0; k--) {
                int p = s[k]+j;
                j = p/('Z'+1);
                s[k] = p % ('Z'+1);
                if (s[k] == 0) s[k] = 'A';
                if (j == 0) break;
            }
            // 再判断一下k的值
            if (j) s = "A" + s;
            if (s == tar) return i; // 与目标串相匹配,返回对应的数字 
        }
    }
    
    int main() {
        cout << method1("LANQIAO") << endl;
        return 0;
    }

    第二种:位数遍历(由于数位刚入门,不会加上dp(动态规划),等会了再补上)

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <vector>
    
    #define ll long long
    
    using namespace std;
    
    int arr[30];// 抽象一下 A-Z变成1到26 
    int dp[30]; // 记忆化数组 
    
    ll dfs(int pos, bool limit, bool head) {
        if (pos == -1) {
            if (head) return 0; // 排除全是0的情况,其实也可以再最后的结果减1 
            return 1;
        }
        ll tal = 0;
        char up = limit?arr[pos]:26; 
        for (int i = 0; i <= up; i++) {
            // 这里解释一下,为了避免出现  X0XXX,其中 1 <= x <= 26 , 表示A-Z 
    if (!head && i == 0) continue; tal+=dfs(pos-1, limit && i == arr[pos], i == 0 && head); } return tal; } ll solve(const string &s) { int pos = 0; for (int i = s.size()-1; i >= 0; i--) { arr[pos++] = s[i]-'A'+1; } vector<char> p; return dfs(pos-1, true, true); } int main() { cout << solve("LANQIAO") << endl; return 0; }

    over........

  • 相关阅读:
    怎样检测数据类型
    怎样理解函数参数的传递
    怎样在微信H5中点击直接跳转到公众号
    怎样启动和关闭nginx服务器
    怎样测试nginx.conf配置文件的正确性
    怎样查找/搜索文件
    怎样创建用户组并添加用户进用户组
    怎样查看Nginx版本号
    怎样写一个Hello World!
    怎样理解基本类型(原始类型)的数据和引用类型的数据
  • 原文地址:https://www.cnblogs.com/hello-dummy/p/12346815.html
Copyright © 2011-2022 走看看