首页 > 其他分享 >划分数列(ybtoj递推练习题1)

划分数列(ybtoj递推练习题1)

时间:2022-08-26 23:58:03浏览次数:62  
标签:练习题 ch ybtoj long re dw include 递推 define

题目描述

给定一个长度为 n 的数列 ,要求划分最少的段数,使得每一段要么单调不降,要么单调不升。

输入格式

第一行一个整数 。

接下来 n 个数表示数列 。

输出格式

输出最少的划分数。

最开始 没有头绪。。。

后来想到 之前做的LIS。。。

然后就

dw[]数组维护单调不降的序列的起点位置;

up[]数组维护单调不升的序列的起点位置;

这样一来;

f[]数组维护划分的最小序列个数

则有

f[i] = min(f[dw[i] - 1],f[up[i]- 1]);

OK 上代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <climits>
 5 #include <cassert>
 6 #include <cmath>
 7 #include <cstring>
 8 #include <cstdlib>
 9 #include <cctype>
10 #include <utility>
11 #include <set>
12 #include <map>
13 #include <stack>
14 #include <queue>
15 #include <vector>
16 #define int long long
17 #define ll long long
18 #define ull unsigned long long
19 #define re register
20 #define lowbit(x) x & (-x)
21 #define gcd(a,b) _gcd(a,b)
22 #define mid ((l + r) >> 1)
23 #define rep(i,a,b)  for(re int i(a);i <= b;i ++)
24 #define rrep(i,a,b) for(re int i(a);i >= b;i --)
25 using namespace std;
26 inline int read(){
27     re int x = 0,f = 1;
28     re char ch = getchar();
29     while(ch < '0' || ch > '9'){
30         if(ch == '-') f = -1;
31         ch = getchar();
32     }
33     while(ch >= '0' && ch <= '9'){
34         x = (x << 3) + (x << 1) + (ch ^ 48);
35         ch = getchar();
36     }
37     return x * f;
38 }
39 const int M = 1e6 + 5;
40 int dw[M];
41 int up[M];
42 int a[M];
43 int f[M];
44 signed main(){
45     int n = read();
46     rep(i,1,n){
47         a[i] = read();
48     }
49     dw[0] = up[0] = 0;
50     f[0] = 0;
51     f[1] = 1;
52     rep(i,2,n){
53         if(a[i] >= a[i - 1]) dw[i] = dw[i - 1];
54         else dw[i] = i;
55         if(a[i] <= a[i - 1]) up[i] = up[i - 1];
56         else up[i] = i;
57         f[i] = min(f[dw[i] - 1] + 1,f[up[i] - 1] + 1);
58     }
59     cout << f[n] << endl;
60     return 0;
61 }

 

标签:练习题,ch,ybtoj,long,re,dw,include,递推,define
From: https://www.cnblogs.com/Eruption/p/16629607.html

相关文章

  • python基础-练习题
    python基础-练习题 选择题: 1.如果变量x=3,那么,请选择x+=3结果为():62.在python解释器中,'a'+'b'+'1'的执行结果为():'ab1'3.python解释器中,执行int('11a')......
  • 完全背包练习题
    题目:P2737思路:这题准确的说,是『布尔型完全背包』。先打一遍板子,很容易。intn;scanf("%d",&n);dp[0]=true;for(inti=1;i<=n;i++){ inta; scanf("%d......
  • Mysql入门练习题
    1、在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄mysql>selectname,agefromstudentswhereage>25andgender='M';+---------------+-----+|name......
  • YBTOJ 贪心算法合集
    奶牛晒衣服开个堆,记录个时间,每次抠出来堆顶减去b再扔回去就做完了。read(n,a,b);rep(i,1,n)read(h[i]);priority_queue<int>q;rep(i,1,n)q.push(h[i]);in......
  • YBTOJ 递推算法合集
    错排问题令\(dp[i]\)表示一个\(i\)的排列的方案数。考虑当前插入一个数\(i\),那么考虑一个位置\(pos\),显然\(pos\)有\(i-1\)种选择假设\(i\)放在了\(......
  • Java基础练习题-错题集(三)
    (1)我们在程序中经常使用“System.out.println()”来输出信息,语句中的System是包名,out是类名,println是方法名。选项:A. 对B.错 (2)以下哪些继承自 Collection 接口()选......
  • 手机类练习题
    手机类练习题案例:DemoPhone1类://成员变量Stringbrand;//品牌intprice;//价格Stringcolor;//颜色//成员方法publicvoidcall(Stringwho){System.out.println("......
  • Java基础练习题目
    2.基础练习2.1减肥计划if版本【应用】2.1.1案例需求​ 输入星期数,显示今天的减肥活动​周一:跑步​周二:游泳​周三:慢走​......
  • Redis基础练习题-错题集(一)
    (1)下面关于Redis中set数据类型与list数据类型的比较,正确的说法是()选项A. set中的数据具有唯一性,list中的数据不具有唯一性B. set中的数据有序,list中的数据无序......
  • 1033 [NOIP2017]逛公园 记忆化搜索 比最短路长k的方案数 dp递推算方案数
     链接:https://ac.nowcoder.com/acm/contest/26077/1033来源:牛客网题目描述策策同学特别喜欢逛公园。公园可以看成一张N个点M条边构成的有......