P1970 花匠
题意:给一个序列,让你删去最少的数使得剩余数满足下列条件之一
1、对于所有正整数i,满足$b_{2i}<b_{2i+1},b_{2i}<b_{2i-1}$
2、对于所有正整数i,满足$b_{2i}>b_{2i+1},b_{2i}>b_{2i-1}$
问最多留下多少数
以f[i]代表从1到i最后一次上升的长度
以g[i]代表从1到i最后一次下降的长度
递推。。。。
#include<cstdio> #include<iostream> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define int long long #define olinr return #define _ 0 #define love_nmr 0 #define DB double inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch=='-') f=-f; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } inline void put(int x) { if(x<0) { x=-x; putchar('-'); } if(x>9) put(x/10); putchar(x%10+'0'); } int h[105050]; int f[105050]; int g[105050]; signed main() { int n; n=read(); for(int i=1;i<=n;i++) h[i]=read(); f[1]=1; g[1]=1; for(int i=2;i<=n;i++) { if(h[i]>h[i-1]) f[i]=g[i-1]+1; else f[i]=f[i-1]; if(h[i]<h[i-1]) g[i]=f[i-1]+1; else g[i]=g[i-1]; } put(max(f[n],g[n])); olinr ~~(0^_^0)+love_nmr; }
----olinr