【贪心】超级波浪数- 10045

【贪心】超级波浪数- 10045

Time Limit: 1000MS
Memory Limit: 32768KB

波 浪数,数的大小关系就象波浪,如“14352”我们从左向右看时数的大小由小到大,然后到小,再到大,再到小,当然14253、14352、24153、 24351、34152、34251、212、121也是波浪数,但122不是波浪数,112,1221也不是波浪数,现在有一个很大的数,我们想从中选 一些数出来,组成一个波浪数,由于数很大,我们叫它超级波浪数。给定一个数,请从中选一个最长的超级波浪数。
输入:
第一行一个数(小于3000位)
输出:
一个数,最长的超级波浪数的长度。
样例:
输入
123251
输出
6

状态:F[i]表示到f[i]位的最大波浪数

状态转移方程{

If(num[i]==num[i-1])f[i]=f[i-1];如果和前面的数相同,那么波浪数不变

If(ok)f[i]=f[i-1]+1;如果位置的数是合法的,波浪数+1

If(!ok)如果不合法,波浪数不增加

}

边界f[1]=1;

 1 # include<stdio.h>
 2 # include<cstring>
 3 # include<iostream>
 4 # include<algorithm>
 5 using namespace std;
 6 const int maxn=3000+10;
 7 int a[maxn],b[maxn],dp[maxn];
 8 char num[maxn];
 9 int main(){
10     scanf("%s",num+1);
11     int n=strlen(num+1);
12     for(int i=2;i<=n;i++)
13     if(num[i]==num[i-1]){
14         a[i]=a[i-1];
15         b[i]=b[i-1];
16     }
17     else if(num[i]>num[i-1])a[i]=a[i-1]+1;
18     else if(num[i]<num[i-1])b[i]=b[i-1]+1;
19     dp[1]=1;
20     for(int  i=2;i<=n;i++){
21         if(num[i]==num[i-1])dp[i]=dp[i-1];
22         else if(a[i]+b[i]==1)dp[i]=dp[i-1]+1;
23         else if(a[i]+b[i]>1) dp[i]=dp[i-1];
24     }
25     printf("%d",dp[n]);
26     return 0;
27 }
时间: 2024-10-26 15:00:32

【贪心】超级波浪数- 10045的相关文章

P1112 波浪数

题目描述 波浪数是在一对数字之间交替转换的数,如1212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数191919是一个十进制下的波浪数,它对应的十一进制数121212也是一个波浪数,所以十进制数191919是一个双重波浪数. 类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚至还有四重波浪数,如十进制300=606(七进制)=363(九进制)=454(八进制)=1A1(十三进制)-,你的任务就是在指定范围内找出双重.三重.四重波浪数. 输入输出格式 输入格式:

【贪心】取数游戏

问题 N: [贪心]取数游戏 时间限制: 1 Sec  内存限制: 64 MB提交: 51  解决: 31[提交][状态][讨论版] 题目描述 给出2n(n≤100)个自然数(小于等于30000).将这2n个自然数排成一列,游戏双方A和B从中取数,只允许从两端取数.A先取,然后双方轮流取数.取完时,谁取得数字总和最大为取胜方:若双方和相等,属B胜.试问A方是否有必胜策略? 输入 共2行,第1行一个整数n:第2行有2*n个自然数. 输出 只有1行,若A有必胜策略,则输出“YES”,否则输出“NO”

【贪心】删数问题

[贪心]删数问题 题目描述 输入一个高精度的正整数n(≤240位),去掉其中任意s个数字后,剩下的数字按原左右次序组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小. 输入 第1行:一个正整数n: 第2行:s(s<n的位数). 输出 最后剩下的最小数. 样例输入 175438 4 样例输出 13分析:结论是删去第一个递减的数,如果没有则删去最后一个数:代码: #include <iostream> #include <cstdio> #incl

Vijos 波浪数

描述 波浪数是在一对数字之间交替转换的数,如1212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数191919是一个十进制下的波浪数,它对应的十一进制数121212也是一个波浪数,所以十进制数191919是一个双重波浪数. 类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚至还有四重波浪数,如十进制300=606(七进制)=363(九进制)=454(八进制)=1A1(十三进制)…,你的任务就是在指定范围内找出双重.三重.四重波浪数. 格式 输入格式 单独一行包含

[Swust OJ 137]--波浪数(hash+波浪数构造)

题目链接:http://acm.swust.edu.cn/problem/137/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 波浪数是在一对数字之间交替转换的数,如1212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数191919是一个十进制下的波浪数,它对应的十一进制数121212也是一个波浪数,所以十进制数191919是一个双重波浪数. 类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚

[RQNOJ313]波浪数

题目描述 波浪数是在一对数字之间交替转换的数,如1212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数191919是一个十进制下的波浪数,它对应的十一进制数121212也是一个波浪数,所以十进制数191919是一个双重波浪数.类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚至还有四重波浪数,如十进制300=606(七进制)=363(九进制)=454(八进制)=1A1(十三进制)…,你的任务就是在指定范围内找出双重.三重.四重波浪数. 输入输出格式 输入格式:

java算法之超级丑数

问题描述: 写一个程序来找第 n 个超级丑数. 超级丑数的定义是正整数并且所有的质数因子都在所给定的一个大小为 k 的质数集合内. 比如给你 4 个质数的集合 [2, 7, 13, 19], 那么 [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] 是前 12 个超级丑数. 注意事项 1:永远都是超级丑数不管给的质数集合是什么. 2:给你的质数集合已经按照升序排列. 0 < k ≤ 100, 0 < n ≤ 10^6, 0 < primes[i] &l

卡特兰数和超级卡特兰数

卡特兰数和超级卡特兰数 这篇博客主要是想讲一下超级卡特兰数(大施罗德数),顺带就想讲一下卡特兰数. 卡特兰数 定义 卡特兰数记为\(C_n\) \(C_1=1\) \(\forall n \geq 2, C_n=\sum_{i=1}^{n-1}C_i C_{n-i}\) 前几项大概是: 1, 1, 2, 5, 14, 42, 132...... 直接递推未免效率太低,我们考虑用生成函数优化. 显然有\(C(x)=C(x)^2+x\) 解得\(C(x)={1-(1-4x)^{\frac 1 2}\

超级丑数--用查找的api解决

class Ugly { constructor(n, primes) { this.n = n this.primes = primes } getAll() { // 超级丑数列表 let res = [1] let i = 2 let primes = this.primes // 不知道上限用while循环 while (res.length < this.n) { let arr = Ugly.getPrimies(i) let k = 0 let l = arr.length for