C++ & Java——1807——动态规划
来源:互联网 发布:php判断字符是否整数 编辑:程序博客网 时间:2024/06/10 22:32
题目描述
给出一个由数字(‘0’-‘9’)构成的字符串。我们说一个子序列是好的,如果他的每一位都是 1、8、0、7 ,并且这四个数字按照这种顺序出现,且每个数字都出现至少一次(111888888880000007 是好的,而 1087 不是)。请求出最大的好的子序列的长度。
输入格式
输入唯一一行一个字符串。
输出格式
一行一个整数表示答案。
样例数据 1
输入
1800777700088888000777
输出
13
备注
【数据范围】
对 30% 的输入数据 :字符串长度≤100 ;
对 100% 的输入数据 :字符串长度≤1000000 。
30%:枚举最后一个1,最后一个0,最后一个8的位置,然后扫一下第一段中有几个1,
第二段中有几个0,第三段中有几个8,最后一段中有几个7,用他们的和更新最大值,复
杂度O(n^4);
100%:dp,用f[i][j]表示做了前面i位,然后当前用到了第j个数字(分别映射1、0、
8、7),然后进行简单的转移,最后f[n][4]就是答案,复杂度O(n);
#include<string.h>#include<string.h>#include<iostream>using namespace std;int f[5],n;char s[1000001];int main(){gets(s);n=strlen(s); memset(f,128,sizeof(f));f[4]=0;for(int i=1;i<=n;++i) {if(s[i-1]=='1') f[0]=max(f[0],f[4])+1;if(s[i-1]=='8') f[1]=max(f[0],f[1])+1;if(s[i-1]=='0') f[2]=max(f[2],f[1])+1;if(s[i-1]=='7') f[3]=max(f[3],f[2])+1;}printf("%d\n",max(f[3],0));return 0;}
import java.util.*; import java.lang.*; public class Main { static int [] f=new int [5];static int n; public static void main(String[] args) { Scanner input = new Scanner(System.in); String s=input.nextLine(); n=s.length(); Arrays.fill(f,-1000000); f[4]=0;for(int i=1;i<=n;++i) { if(s.charAt(i-1)=='1') f[0]=Math.max(f[0],f[4])+1;if(s.charAt(i-1)=='8') f[1]=Math.max(f[0],f[1])+1;if(s.charAt(i-1)=='0') f[2]=Math.max(f[2],f[1])+1;if(s.charAt(i-1)=='7') f[3]=Math.max(f[3],f[2])+1; } if(f[3]<0) f[3]=0; System.out.println(f[3]); } }
阅读全文
0 0
- 动态规划—Problem C
- 动态规划——problem c
- 动态规划 III——C - Travel
- 【C++】 动态规划—矩阵链乘
- 动态规划——什么是动态规划?
- C++ & Java——1807——动态规划
- 动态规划 — LIS
- 《C算法》——递归和动态规划
- 《C算法》——递归和动态规划[转贴]
- 算法题——Unique Paths(C++)动态规划
- C++——动态规划入门 笔记1
- 动态规划——Relocation 动态规划+状态压缩
- 动态规划——序
- 算法——动态规划
- 算法——动态规划
- 动态规划——最大值
- 动态规划——猴子
- POJ1036——动态规划
- Android Dialog设置宽度显示不正常的问题(自定义设置Dialog的宽高)
- 如何从红帽官方网站下载镜像文件
- springMVC框架搭建流程
- vuex的初步了解
- 在Ubuntu终端彻底删除软件
- C++ & Java——1807——动态规划
- js时间戳的相互转换
- 以操作系统的角度述说线程与进程
- 关于我的Mac第一次重装苹果系统的记录
- 各类软件注册码汇总
- RecyclerView 实现 间隔线
- 为什么程序写入PLC重新上电无程序
- C#备份、恢复数据库
- mysql57 初次登陆失败问题