Dividir la secuencia (recursividad)

Dividir la secuencia

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Ideas para resolver problemas

Configuración fi f_iFyoIndica el número mínimo de segmentos que se pueden dividir de uno a i,
luego hay una ecuación de transferencia

fi = min (fbi - 1, fci - 1) + 1 f_i = min (f_ {b_i} −1, f_ {c_i} −1) +1 Fyo=m i n ( fsegundoyo- 1 ,FCyo- 1 )+1
bi b_isegundoyoRepresenta el punto de partida de un segmento que aumenta monótonamente y termina en i
ci c_iCyoIndica el punto de partida de un párrafo decreciente monótona que termina con i

Código AC

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,last,a,b[100005],c[100005],f[100005];
int main()
{
    
    
	scanf("%d%d",&n,&last);
	b[1]=c[1]=1;//初值
	for(int i=2;i<=n;i++)//预处理
	{
    
    
		scanf("%d",&a);
		if(a>=last)b[i]=b[i-1];
		else b[i]=i;
		if(a<=last)c[i]=c[i-1];
		else c[i]=i;
		last=a;
	}
	memset(f,0x7fff,sizeof(f));//初值
	f[0]=f[1]=0;
	for(int i=1;i<=n;i++)//递推
	 f[i]=min(f[b[i]-1]+1,f[c[i]-1]+1);
	printf("%d",f[n]);
	return 0;
}

Gracias

Supongo que te gusta

Origin blog.csdn.net/weixin_45524309/article/details/111594387
Recomendado
Clasificación