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;
}