【递推】【贪心】Ybt_划分数列

题目大意

给出一个长度为n的序列,用次数最少的划分,使得每部分单调不升或单调不降。
求这个次数。

输入
9
1 2 1 2 1 2 1 2 1 
输出
5

从第一个数开始,判断数字的趋势。趋势相同的划分到同一个部分,如不同,则划分到下一个部分。


代码

#include<cstdio>
//ud:0代表未知趋势,1代表上升,2代表向下
int n,ans,ud,k[5];
int main(){
    
    
	scanf("%d", &n);
	scanf("%d", &k[1]); 
	ud = 0; ans = 1; 
	for(int i = 2; i <= n; ++i){
    
    
		scanf("%d", &k[i%2]);
		if(ud == 0){
    
      //还显示出趋势
			if(k[i%2] > k[(i-1)%2]) ud = 1;  //如果当前数给了当前部分一个趋势
			else if(k[i%2] < k[(i-1)%2]) ud = 2; 
		} 
		else if(ud == 1 && k[i%2] < k[(i-1)%2]){
    
      //上升趋势断开
			++ans;  //重置,累计答案
			ud = 0;
		}
		else if(ud == 2 && k[i%2] > k[(i-1)%2]){
    
     //下降趋势断开
			++ans;  //重置,累计答案
			ud = 0;
		}
	}
	printf("%d",ans);
} 

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/111725311