semana10-C-Toma el problema numérico II

tema

Después de que YJQ terminó la décima semana de pensamiento y práctica de programación, se le ocurrió una idea brillante: hizo una pequeña modificación al problema de conteo, que lo convirtió en un problema de conteo II.

Dada una secuencia, hay n números en ella, y cada paso puede tomar un número, por ejemplo, tomar el número i-ésimo, Ai = x, y obtener la puntuación correspondiente x, pero después de eliminar este Ai, x + 1 y x-1 ( Si hay Aj = x + 1 o Aj = x-1, se volverá inaccesible (pero si hay Aj = x, puede continuar tomando esta x). Encuentra la puntuación máxima.

Esta pregunta es un poco diferente de lo que se enseñó en clase, pero el núcleo es el mismo, debes pensarlo tú mismo.

Entrada

La primera línea contiene un número entero n (1 ≤ n ≤ 105), que representa el número de elementos en el número. La
segunda línea contiene n números enteros a1, a2,…, an (1 ≤ ai ≤ 105)

Salida

Genere un número entero: n puede obtener la puntuación máxima.

Ideas

a [i] Registre el número de números que aparecen en la matriz.
Convierta dp [i] al puntaje máximo que se puede obtener considerando solo los números 1 ~ i,
dp [i] = max (dp [i-1], dp [ i-2] + a [i] * i)

error

1. Tenga en cuenta que se debe usar long long para almacenar la matriz

Código

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=1e5+10;
long long a[maxn]={
    
    0};
long long dp[maxn];
int main()
{
    
    
 long long n,tmp,maxx=0;
 memset(a,0,sizeof(a));
 cin>>n;
 for(int i=0;i<n;i++)
 {
    
    
  cin>>tmp;
  a[tmp]++;
  if(maxx<tmp)
   maxx=tmp;  
 }
 dp[0]=0;
 dp[1]=a[1];
 for(int i=2;i<=maxx;i++)
  dp[i]=max(dp[i-1],dp[i-2]+a[i]*i);
 cout<<dp[maxx]<<endl;
 
 return 0;
}

Supongo que te gusta

Origin blog.csdn.net/alicemh/article/details/105799838
Recomendado
Clasificación