cuestiones de corto LIS

Misil interceptación
tiempo complejidad de O (nlogn)
encontrar las secuencias más largas Tiempo de subida:
DP [P], siendo P la secuencia más larga de números no se elevan secuencias aumenta desde 1 comienza, según dw teorema, es decir, el número máximo es m aumento de la longitud de la más larga sub-secuencia también se divide en m grupos de no mínima se eleva secuencia.

#include<bits/stdc++.h>
using namespace std;
int a[100010],dp1[100010],dp2[100010],n;
int main(){
    while(cin>>a[++n]);
    --n;
    //最不上升子序列
    int m=0;
    for(int i=1;i<=n;++i){
        int p=upper_bound(dp1+1,dp1+1+m,a[i],greater<int>())-dp1;
        dp1[p]=a[i];
        m=max(m,p);
    }
    cout<<m<<endl;
    m=0;
    //最长上升子序列
    for(int i=1;i<=n;++i){
        int p=lower_bound(dp2+1,dp2+1+m,a[i])-dp2;
        dp2[p]=a[i];
        m=max(m,p);
    }
    cout<<m<<endl;
    return 0;
}


ordenación parcial Tal enfoque puede ser resuelto de dos dimensiones de paquetes a ser registrada
E2. Cadena Coloring (versión dura)
se da una serie de letras minúsculas, el número mínimo de secuencia de salida sub-dividido de tal manera que cada sub-secuencia no es inversa, y la salida de cada número de secuencia de letras pertenece.

entrada:

7
abcdedc

salida:

3
1 1 1 1 1 2 3

No decreciente más largo número de secuencia de paquete corresponde a la secuencia gota demanda más larga

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int dp[maxn];
char s[maxn];
int ans[maxn];
int main(){
    int n;
    scanf("%d",&n);
    scanf("%s",s+1);
    int m=0;
    for(int i=1;s[i];++i){
        int p=lower_bound(dp+1,dp+1+m,s[i]-'a'+1,greater<int>())-dp;
        dp[p]=s[i]-'a'+1;
        m=max(m,p);
        ans[i]=p;
    }
    cout<<m<<endl;
    for(int i=1;i<=n;++i){
        cout<<ans[i]<<" ";
    }
    return 0;
}

Publicado 96 artículos originales · ganado elogios 11 · vistas 2254

Supongo que te gusta

Origin blog.csdn.net/weixin_43769146/article/details/104335568
Recomendado
Clasificación