原题:牛客网

动态规划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. 【转载】 C#中使用decimal.Parse方法将字符串转换为十进制decimal类型

    在C#编程过程中,很多时候涉及到数据类型的转换,例如将字符串类型的变量转换为十进制decimal类型就是一个常见的类型转换操作,decimal.Parse方法是C#中专门用来将字符串转换为decima ...

  2. Windows下搭建TensorFlow的GPU版本

    1.下载python3.5.2版本并安装(必须是3.5版本,而且3.5后不带字母的版本) 2.使用下面的地址下载tensorflow的GPU版本 http://www.lfd.uci.edu/~goh ...

  3. day 14作业

    作业 现有文件info.txt, 其内容如下: alpha male 18 1000 bravo male 28 2000 charlie female 38 3000 delta female 48 ...

  4. day 04 作业 预科

    目录 作业 1.分别列出 数字类型.字符串类型.列表.字典 的 作用.定义方式和使用方法. 数字类型 字符串类型 列表 字典 词云图 作业 1.分别列出 数字类型.字符串类型.列表.字典 的 作用.定 ...

  5. configure生成makefile的配置项说明

    一般Linux软件使用configure来检测系统生成makefile文件之后可使用make来编译安装软件. configure的配置选项有哪些呢?现简单收集如下,不断更新中. 以gcc -v为例,可 ...

  6. Netlink: 内核与用户空间传输数据的socket协议

    https://en.wikipedia.org/wiki/Netlink https://stackoverflow.com/questions/12899055/how-kernel-notify ...

  7. vue父组件触发子组件方法

    比如应用场景是弹窗中的组件,想要点弹窗时更新该组件展示对应记录的的值 methods: { edit (record) { this.mdl = Object.assign({}, record) t ...

  8. moviepy改进的想码

    这个要比前一个厚实点. 更改视频亮度,增加字幕,去除音轨,淡入特效,转换,截取时间,控制位置,组合图框,合成多段, 嗯,很多都有了. from django.test import TestCase ...

  9. django migrate报错:1005 - Can't create table xxx (errno: 150 "Foreign key constraint is incorrectly formed")

    自从mysql升级,以及使用mariaDB以来,很多不曾更新django中model的外键, 今天,按以前的思路写完外键之后, migrate命令报错: 1005 - Can't create tab ...

  10. Android Handler机制彻底梳理

    Android的消息机制其实也就是Handler相关的机制,对于它的使用应该熟之又熟了,而对于它的机制的描述在网上也一大堆[比如15年那会在网上抄了一篇https://www.cnblogs.com/ ...