6058. 统计打字方案数

简介: 笔记

题面


1.png


样例


2.png


思路


如题:即转化为连续一段的相同数字用(1、2、3、4)来表示的方案数。(‘7’,‘9’)有四个按键即为(1、2、3、4),其余(1、2、3)。


那么根据乘法原理答案自然是:所有段的方案数之积。


求(1、2、3)凑数字 x 的方案数


f [ i ] :表示用3个数字凑出数字 i {i}i 的方案数。


转移方程:f [ i ] = f [ i − 1 ] + f [ i − 2 ] + f [ i − 3 ]

同理:4个数字凑也是一样计算。


代码


class Solution {
public:
    #define ll long long
    ll f[100010], g[100010];
    int mod = 1e9 + 7;
    void init() {
        f[1] = 1;
        f[2] = 2;
        f[3] = 4;
        for (int j = 4; j <= 100000; j++) {
            f[j] = (f[j] + f[j - 1] + f[j - 2] + f[j - 3]) % mod;
        }
        g[1] = 1;
        g[2] = 2;
        g[3] = 4;
        g[4] = 8;
        for (int j = 5; j <= 100000; j++) {
            g[j] = (g[j] + g[j - 1] + g[j - 2] + g[j - 3] + g[j - 4]) % mod;
        }
    }
    int countTexts(string a) {
        init();
        int n = a.size();
        vector<int> v1, v2;
        int res = 1;
        for (int i = 1; i < a.size(); i++) {
            if(a[i] != a[i - 1]) {
                if(a[i - 1] == '7' || a[i - 1] == '9') v2.push_back(res);
                else v1.push_back(res);
                res = 0;
            }
            res++;
        }
        if(a[n - 1] == '7' || a[n - 1] == '9') v2.push_back(res);
        else v1.push_back(res);
        int ans = 1;
        for (int i = 0; i < v1.size(); i++) ans = ((ll)ans * f[v1[i]]) % mod;
        for (int i = 0; i < v2.size(); i++) ans = ((ll)ans * g[v2[i]]) % mod;
        return ans;
    }
};
class Solution {
public:
    int countTexts(string s) {
        const int mod = 1e9 + 7;
        vector<int> a(10, 3);
        a[7] = a[9] = 4;
        long long ans = 1;
        for (int i = 0, j = 0; j < s.size(); i = j) {
            while(j < s.size() && s[i] == s[j]) ++ j;
            int x = s[i] - '0', cnt = j - i;
            vector<long long> f(cnt + 1);
            f[0] = 1;
            for (int i = 1; i <= cnt; i++)
                for (int j = 1; j <= a[x]; j++)
                    if(i - j >= 0) f[i] = (f[i] + f[i - j]) % mod;
            ans = ans * f[cnt] % mod;
        }
        return ans % mod;
    }
};
相关文章
|
JSON 数据格式 Python
桌面壁纸实时展示粉丝数
桌面壁纸实时展示粉丝数
|
存储 缓存 Dart
如何处理直播实时在线人数显示并且最小化性能和资源消耗?
直播技术成为一种极为流行的交流方式。而直播平台的核心指标之一就是实时在线人数,准确地显示该指标对于用户和运营商来说都具有重要意义。然而,直播实时在线人数的显示也面临着性能和资源消耗的挑战。本文将介绍如何利用Flutter和Dart开发技术栈来优化直播实时在线人数的显示,以达到最小化性能和资源消耗的目标。 作者:狗头大军之江苏分军 链接:https://juejin.cn/spost/7255473856234913852 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如何处理直播实时在线人数显示并且最小化性能和资源消耗?
|
小程序 数据挖掘 BI
如何统计游戏中的数据
文主要内容是教你如何统计小游戏中的数据,强烈建议收藏,因为你迟早会在自己的小游戏中用到。 如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列教程,它会手把手的教你做出自己的第一个小游戏。
178 0
|
数据采集 NoSQL Java
【最佳实践】页面浏览量统计的绝佳实现
【最佳实践】页面浏览量统计的绝佳实现
1126 0
【最佳实践】页面浏览量统计的绝佳实现
|
Rust 自然语言处理 算法
【算法】2037. 使每位学生都有座位的最少移动次数(多语言实现)
一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示。给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数组 students ,其中 students[j] 是第 j 位学生的位置。 你可以执行以下操作任意次: 增加或者减少第 i 位学生的位置,每次变化量为 1 (也就是将第 i 位学生从位置 x 移动到 x + 1 或者 x - 1) 请你返回使所有学生都有座位坐的 最少移动次数 ,并确保没有两位学生的座位相同。 请注意,初始时有可能有多个座位或者多位学生在 同一 位置。
【算法】2037. 使每位学生都有座位的最少移动次数(多语言实现)
|
数据采集 消息中间件 大数据
爬虫识别-关键页面最小访问间隔-需求及思路|学习笔记
快速学习爬虫识别-关键页面最小访问间隔-需求及思路
156 0
|
存储 SQL Oracle
30亿日志,检索+分页+后台展示,你是否遇到过更奇葩的需求?
一个数据库查询日志,前台页面显示的问题。
735 0
30亿日志,检索+分页+后台展示,你是否遇到过更奇葩的需求?
比阅读量和粉丝数更重要的是用户ARPU值
对于多数内容创业者而言,一个公众号的粉丝数和阅读量是有上限/瓶颈的。在这种情况下,得尽可能挖掘一个公众号的商业价值,这时候就得注重一个目标,叫做ARPU值。在新媒体运营行业,我们还没有见过谁对它有清晰的解释和定义。
2163 0