#C++初学记录(动态规划 被3整除的子序列)
原题:牛客网
动态规划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整除的子序列)的更多相关文章
- #C++初学记录(动态规划(dynamic programming)例题1 钞票)
浅入动态规划 dynamic programming is a method for solving a complex problem by breaking it down into a coll ...
- #C++初学记录(sort函数)
sort函数 前言:当进行贪心算法的学习时,需要用到sort函数,因为初学c++汇编语言,sort的具体用法没有深入学习,所以这里进行sort学习记录并只有基础用法并借用贪心算法题目的代码. 百度百科 ...
- javaweb初学记录
原文 链接 http://blog.csdn.net/iojust/article/details/52429805 - ---热情依旧 - 环境搭建: - jdk环境配置 jdk下载: http:/ ...
- HDU 1160 FatMouse's Speed 动态规划 记录路径的最长上升子序列变形
题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了 ...
- #C++初学记录(算法4)
A - Serval and Bus It is raining heavily. But this is the first day for Serval, who just became 3 ye ...
- 动态规划:HDU1160-FatMouse's Speed(记录动态规划状态转移过程)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- #C++初学记录(acm试题#预处理)
C - Lucky 7 in the Pocket BaoBao loves number 7 but hates number 4, so he refers to an integer as a ...
- Java 初学记录之可执行jar包
环境 jdk7 jre7 当我用jdk7开发的时候,编写完成可执行的jar工具,并且成功使用. 当我在另一台机器安装了jre6,再次运行我的小工具jar 的时候,报错 解决: http://stack ...
- Java 初学记录之一 快速输入
1. sysout 按回车 System.out.println();
随机推荐
- js对象及函数(四)
一.对象1.函数对象的创建方法一:使用new构造函数去创建构造函数对象eg: var obj = new Object(); //向对象里面添加属性或方法 obj.name = 'nzc'; obj. ...
- 在Controller中添加事务管理
文章参考了此博客: https://blog.csdn.net/qq_40594137/article/details/82772545 写这篇文章之前先说明一下: 1. Controller中添加事 ...
- 深入理解jvm--性能监控工具
1.jvm监控工具介绍 1.1.jconsole JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动. 1.2.启动jconsole 通过JD ...
- jmeter的简单使用0723
一.添加http请求 1.右击线程组---添加---取样器---http请求,具体内容如下图所示.如果请求带参数,则要点击下方的添加按钮来添加参数 2.查看请求结果,同样右击线程组-添加---监听器- ...
- static 关键字在java语言中的特性
一,将自己注入到一个静态变量中实现静态类,如下写法 以上方法的目的是要实现一个静态类,方便用类名获取对象实例,一般情况下调用普通方法需要对象实例.这对象要么new出来,要么spring的注入如下是 ...
- Java调用Kotlin事项及Kotlin反射初步
继续来研究Java调用Kotlin的一些东东. @Throws注解: 我们知道在Kotlin中是不存在checked exception的,而在Java中是存在的,那..如果从Java来调用Kotli ...
- Triton 学习
介绍 Triton 是一款动态二进制分析框架,它支持符号执行和污点分析,同时提供了 pintools 的 python 接口,我们可以使用 python 来使用 pintools 的功能. Trito ...
- LeetCode(数据库):分数排名
,)); Truncate table Scores; ', '3.5'); ', '3.65'); ', '4.0'); ', '3.85'); ', '4.0'); ', '3.65'); 编写一 ...
- 英语听力,如何成为更好的交谈着https://www.bilibili.com/video/av4279405?from=search&seid=5889429711390689339
and how many of you know at least one person that you because you just do not want to talk to them.y ...
- php for循环遍历索引数组
遍历二字,从字面解释就是一个接一个全读访问一次,显示出来. 因为for循环是一个单纯的计数型循环,而索引数组的下标为整型的数值.因此,我们可以通过for循环来遍历索引数组. 我们知道索引数组下标为整型 ...