原题:牛客网

动态规划dynamic programming 的入门级题目

题目描述 :

给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除

答案对1e9+7取模

输入描述:

输入一个字符串,由数字构成,长度小于等于50

输出描述:

输出一个整数

示例

输入:


132

输出:

3

正确代码

#include <bits/stdc++.h>
using namespace std;
const int Mod=1e9+7;
int dp[3];
char a1[55];
int main()
{ cin.getline(a1,55);
memset(dp,0, sizeof(dp));
int n=strlen(a1);
for(int i=0;i<n;i++)
{
int s0=0,s1=0,s2=0;
int x=a1[i]-'0';
if(x%3==0){
s0+=dp[0]+1;
s1+=dp[1];
s2+=dp[2];
}
if(x%3==1){
s0+=dp[2];
s1+=dp[0]+1;
s2+=dp[1];
}
if(x%3==2){
s0+=dp[1];
s1+=dp[2];
s2+=dp[0]+1;
}
dp[0]+=s0;
dp[1]+=s1;
dp[2]+=s2;
for(int j=0;j<3;j++)
dp[j]=dp[j]%Mod;
}
cout<<dp[0]<<endl; }

题目认知:

子序列与子串的区别在于连续与否,子串连续,子序列不连续,因此根据题意我们要对所有子序列进行判断是否满足题意和满足题意的子序列的个数有多少个,最后对结果取余数,取余数时,无论是最后一起取余,还是分步取余结果都是一样的,因此,分步取余更易于存储。

对于如何对子序列进行判断

就上文中的正确代码里,我使用了一个for循环对整个数组进行一次遍历,一次遍历即可求出所要结果。

就dp思想而言,我们应该将大问题化为小问题,逐个对小问题进行求解,因此应该考虑如何分离子序列,然后再对子序列进行判断。

#C++初学记录(动态规划 被3整除的子序列)的更多相关文章

  1. #C++初学记录(动态规划(dynamic programming)例题1 钞票)

    浅入动态规划 dynamic programming is a method for solving a complex problem by breaking it down into a coll ...

  2. #C++初学记录(sort函数)

    sort函数 前言:当进行贪心算法的学习时,需要用到sort函数,因为初学c++汇编语言,sort的具体用法没有深入学习,所以这里进行sort学习记录并只有基础用法并借用贪心算法题目的代码. 百度百科 ...

  3. javaweb初学记录

    原文 链接 http://blog.csdn.net/iojust/article/details/52429805 - ---热情依旧 - 环境搭建: - jdk环境配置 jdk下载: http:/ ...

  4. HDU 1160 FatMouse's Speed 动态规划 记录路径的最长上升子序列变形

    题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了 ...

  5. #C++初学记录(算法4)

    A - Serval and Bus It is raining heavily. But this is the first day for Serval, who just became 3 ye ...

  6. 动态规划:HDU1160-FatMouse's Speed(记录动态规划状态转移过程)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. #C++初学记录(acm试题#预处理)

    C - Lucky 7 in the Pocket BaoBao loves number 7 but hates number 4, so he refers to an integer as a ...

  8. Java 初学记录之可执行jar包

    环境 jdk7 jre7 当我用jdk7开发的时候,编写完成可执行的jar工具,并且成功使用. 当我在另一台机器安装了jre6,再次运行我的小工具jar 的时候,报错 解决: http://stack ...

  9. Java 初学记录之一 快速输入

    1. sysout 按回车 System.out.println();

随机推荐

  1. VUE过滤器 基础回顾5

    过滤器是一种在模板中处理数据的便捷方式,特别适合对字符串和数组进行简易显示 <div id="app"> <p>商品1花费{{oneCost | froma ...

  2. 十二、vue中watch原理

    1.普通的watch 2.对象属性的watch:   对象和数组都是引用类型,引用类型变量存的是地址,地址没有变,所以不会触发watch.这时我们需要进行深度监听,就需要加上一个属性 deep,值为 ...

  3. 纯css实现省略号,兼容火狐,IE9,chrome

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. kali安装结束重启黑屏?

    很多人碰到过kali在安装结束后自动重启,屏幕黑屏就显示一个光标. 解决办法: 安装最后一步,不要选择默认项 Enter device manually 改选第二项.....具体什么忘记了. 即可解决 ...

  5. ETL 的一些概念

    1. What is a logical data mapping and what does it mean to the ETL team? 什么是逻辑数据映射?它对ETL项目组的作用是什么? 答 ...

  6. MySQL数据库扫盲篇

    MySQL数据库扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.MySQL概述 1>.什么是MySQL MySQL是瑞典的MySQL AB公司开发的一个可用于各 ...

  7. docker学习3-镜像的基本使用

    前言 Docker的三大核心概念:镜像.容器.仓库.初学者对镜像和容器往往分不清楚,学过面向对象的应该知道类和实例,这跟面向对象里面的概念很相似 我们可以把镜像看作类,把容器看作类实例化后的对象. d ...

  8. c++练手项目:英语单词拼写测试程序

    代码比较简单.基本的思路是从文本文件中按行读取数据,数据结构为“hello-你好”.前面是英语,后面是中文,中间用“-”连接.程序通过查找连词符的位置来分割中文和英文.再通过和用户输入的单词进行比较判 ...

  9. C# CustomValidator

    当各种验证控件的验证类型都不能满足需要时可以使用CustomValidator验证控件,通过自定义验证函数来验证.直接看例子 <%@ Page Language="C#" A ...

  10. 【转】TUN/TAP虚拟网络设备

    转: 原文:https://www.cnblogs.com/wyzhou/p/9286864.html ------------------------------------------------ ...