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;
    }
};
相关文章
|
7月前
|
存储 前端开发 NoSQL
如何优雅地实现在线人数统计功能:技术干货分享
在现代Web开发中,实时在线人数统计是一个常见且重要的功能,它不仅提升了用户体验,还能为网站运营者提供宝贵的数据支持。今天,我们将深入探讨如何优雅地实现这一功能,结合前端展示、后端处理及数据存储等多个方面,为您呈现一套完整的技术解决方案。
731 5
文本,好看的设计------我独自升级,六芒星技能表,可以用来判断是否在能力值之内的事情,使用六芒星可以显示能力之内,能力之外的事情,用以判断
文本,好看的设计------我独自升级,六芒星技能表,可以用来判断是否在能力值之内的事情,使用六芒星可以显示能力之内,能力之外的事情,用以判断
文本,好看的设计------我独自升级,六芒星技能表,可以用来判断是否在能力值之内的事情,使用六芒星可以显示能力之内,能力之外的事情,用以判断
分页最好的作用是做好统计,可以用来基本条件列表的统计,可以用来统计多平台,使之呈现列表,预算统计,以及必要的技术,项目名称,常用链接
分页最好的作用是做好统计,可以用来基本条件列表的统计,可以用来统计多平台,使之呈现列表,预算统计,以及必要的技术,项目名称,常用链接
|
10月前
|
小程序 API
技术心得记录:微信小程序之图片频繁变化,几秒之后输出结果(适用于抽奖)
技术心得记录:微信小程序之图片频繁变化,几秒之后输出结果(适用于抽奖)
70 0
|
Java Spring
统计业务方法耗时【项目 商城】
统计业务方法耗时【项目 商城】
188 0
统计业务方法耗时【项目 商城】
|
存储 缓存 Dart
如何处理直播实时在线人数显示并且最小化性能和资源消耗?
直播技术成为一种极为流行的交流方式。而直播平台的核心指标之一就是实时在线人数,准确地显示该指标对于用户和运营商来说都具有重要意义。然而,直播实时在线人数的显示也面临着性能和资源消耗的挑战。本文将介绍如何利用Flutter和Dart开发技术栈来优化直播实时在线人数的显示,以达到最小化性能和资源消耗的目标。 作者:狗头大军之江苏分军 链接:https://juejin.cn/spost/7255473856234913852 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如何处理直播实时在线人数显示并且最小化性能和资源消耗?
|
数据可视化 测试技术 Python
sum() 函数性能堪忧,列表降维有何良方?
(1)sum() 函数的性能到底差多少,为什么会差?(2)既然 sum() 不是最好的列表降维方法,那是否有什么替代方案呢?
237 0
sum() 函数性能堪忧,列表降维有何良方?
|
存储 NoSQL 安全
【Redis】位图以及位图的使用场景(统计在线人数和用户在线状态)
【Redis】位图以及位图的使用场景(统计在线人数和用户在线状态)
【Redis】位图以及位图的使用场景(统计在线人数和用户在线状态)
|
编解码 图形学 异构计算
实时云渲染技术支持服务器多少并发的判断方法
点量实时云渲染软件,支持服务器开启多少路并发判断方法如下: 1、找一台服务器安装需要云流化的内容,比如UE4或者Unity3D的EXE程序(也可以是其他的Windows下的EXE程序),注意为了更好的测试,可以复制到多个文件夹。 2、一次次打开安装的EXE程序,最好进入程序中消耗资源比较大的界面,同时观察CPU和GPU的负载,在二者达到85%左右的时候,看看打开了多少个EXE程序。一般这就是这台服务器上能同时开启的并发路数。
456 0
 实时云渲染技术支持服务器多少并发的判断方法
|
算法 前端开发
【前端算法】独一无二的出现次数,统计次数加去重
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
123 0