首页 > 其他分享 >dp 集合思想优化

dp 集合思想优化

时间:2024-04-25 19:35:12浏览次数:27  
标签:pre 10 偶数 字符串 ans 集合 优化 dp

链接:https://ac.nowcoder.com/acm/contest/78807/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

Bingbong 有一个长度为 n 的数字字符串 S,该字符串仅包含 [0, 9] 的数字。

Bingbong 想要从中挑选出若干个字符,然后按照其相对顺序重新拼接而成一个数字,使其是一个无前导 0 的偶数

例如:当 n = 3, S = 100。其包含的偶数数字有 0, 0, 10, 10, 100。而 00 是不符合条件的,因为其含有前导 0。

由于字符串实在是太长了,他一个人数不过来,请您帮他计算一下该字符串中含有的偶数方案总数, 结果对 1e9 + 7 取模。

输入描述:

第一行一个整数 n (1 ≤ n ≤ 2×10^5),表示字符串 S 的长度。

第二行一个长度为 n 的字符串 S ,保证输入只含 [0, 9] 的数字。

输出描述:

一个整数,表示最后含有的偶数方案总数。

示例1

输入

3
100

输出

5

示例2

输入

5
12345

输出

10

解答

  • 此题使用 dp 的思想,记录之前所有的方案,然后看要加入的数能否构成答案,如果可以就加入答案,并计算这个数能构成的方案
  • ans 表示的是从它往前的偶数集合
  • pre 表示的是当前数前面的数,能构成哪些数的集合,这就不管偶数还是奇数了,表示一个集合
  • 很抽象,对吧
  • 假设 1024,遍历到 2 的时候,pre 表示的是:10,1,0,解释 ans = ans + pre + 1pre 要加是因为 pre 是一个集合,这个集合内的数加上当前数一定是偶数,ans 是前面合法情况, +1 是加上当前数单独作为一种情况
  • 解释为啥 s[i -1] != '0',要 pre++,原因是当前数的前者数是偶数,需要把这个数加入 pre,而加入后组成的数,前面 pre 可选,可不选,当前数可选可不选,后面也就是 (pre + 1) * 2 种方案也就满足,而等于 0 情况,也就是当前 0 一定不选,前面 pre 可选可不选,直接 pre * 2,所以不等于加 1,然后再 ×2,另一个直接 x2
#include <iostream>
#include <string>
using namespace std;
const int mod = 1e9 + 7;
int n;
string s;

int main()
{
    cin >> n >> s;

    long long ans = 0, pre = 0;
    for (int i = 0; i < n; i++) 
    {
        if (i > 0 && s[i - 1] != '0') pre++;
        if (s[i] % 2 == 0) ans = (ans + pre + 1) % mod;
        
        pre = (pre * 2) % mod;
    }

    cout << ans << endl;
    return 0;
}

标签:pre,10,偶数,字符串,ans,集合,优化,dp
From: https://www.cnblogs.com/xingzhuz/p/18158345

相关文章

  • Unity性能优化——字符串和文本
    字符串和文本字符串和文本的处理不当是Unity项目中性能问题的常见原因。在C#中,所有字符串均不可变。对字符串的任何操作均会导致分配一个完整的新字符串。这种操作的代价相对比较高,而且在大型字符串上、大型数据集上或紧凑循环中执行时,接连不断的重复的字符串可能发展成性能......
  • 超低功耗三通道低频无线唤醒 ASK 接收芯片DP20RF003
    DP20RF003是一款三通道、超低功耗的ASK接收芯片,可检测30~300KHz范围的LF(低频)载波频率数据并触发唤醒信号,唤醒之后MCU可通过IO实时采集后续接收到的数据,也可以通过SPI或I2C直接从寄存器读取(最多保存8字节数据)。三个独立通道可以配置成不同的唤醒模式,每个通道都具......
  • Tomcat调优总结(Tomcat自身优化、Linux内核优化、JVM优化)【转】
    Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例,讲解参数。同时也得认识到一点,tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。因此我们可以将tomcat调优分为linux内核......
  • 性能问题分析优化实践案例
    星球同学问了这样一个性能分析的问题:他们有一个地图服务,数据都存储在同一个sqlserver实例中,访问量过高导致服务挂了,开发的解决方案是将地图服务的内存从4G升级到8G,问题就解决了。她的问题是开发的这种解决办法是否是最优解,有没有更好的解决方案。由于我对他们的系统架构......
  • 线性dp--最长上升子序列变形
    ATwistyMovement洛谷链接:https://www.luogu.com.cn/problem/CF933Acodeforce链接:https://codeforces.com/problemset/problem/933/A题面翻译给定一个序列A,你可以翻转其中的一个区间内的数,求翻转后的序列的最长不下降子序列的长度。(\(|A|\le2000,1\lea_i\le2\))感谢@to......
  • tcp和udp有什么区别-简要
     传输控制协议(TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP为应用程序提供了一种无需建立连接就可以发送封装的IP数据包的方法。区别:连接方面,安全方面,传输效率,连接对象数量。1、连接方面区别TCP面向连接(如打电话要先拨号建立连接)。UDP是无连接的,即发送数......
  • 详细介绍tcp和udp有什么区别
    tcp和udp的区别有:1、udp是无连接的,tcp是面向连接的;2、udp是不可靠传输,tcp是可靠传输;3、udp是面向报文传输,tcp是面向字节流传输。  UDPUDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的......
  • Appium控件交互策略:优化自动化测试效率的关键方法
    简介与Web元素操作一样(参考SeleniumWeb元素操作),定位到APP控件元素后,可以对控件进行一系列的操作,实现与APP交互,比如点击、文本输入、元素属性获取等。控件交互常用方法常见操作点击方法element.click()。输入操作element.send_keys('appium')。清除操作element......
  • 力扣-645. 错误的集合
    1.题目介绍题目地址(645.错误的集合-力扣(LeetCode))https://leetcode.cn/problems/set-mismatch/题目描述集合s包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合丢失了一个数字并且有一个数字重复。......
  • Oracle "脑残" CBO 优化案例
    今天晚上下班回来才有空看群,群友发了一条很简单的慢SQL问怎么优化。非常简单,我自己模拟的数据。表结构:--auto-generateddefinitionCREATETABLEHHHHHH(IDNUMBERNOTNULLPRIMARYKEY,NAMEVARCHAR2(20),PARAGRAPH_IDNUMBER......