Lien thématique: cliquez ici
Signification: donné un KKPour une séquence de K entiers, la plus grande sous-séquence fait référence à la plus grande somme de tous les éléments de la sous-séquence continue. Par exemple, étant donné la séquence{- 2, 11, - 4, 13, - 5, - 2} \ left \ {- 2, 11, -4, 13, -5, -2 \ right \}{ - 2 ,1 1 ,- 4 ,1 3 ,- 5 ,- 2 } , la plus grande sous-séquence est{11, - 4, 13} \ left \ {11, -4, 13 \ right \}{ 1 1 ,- 4 ,1 3 } , la somme maximale est20 202 0 . Vous devez maintenant trouver la plus grande somme et les premier et dernier nombres de la plus grande sous-séquence.
Idées:
Une explication détaillée de la somme maximale des sous-séquences: cliquez ici
Sur la base du code ci-dessus, comment trouver les premier et dernier nombres de la plus grande sous-séquence?
Puisque les sous-séquences que nous recherchons sont toutes disjointes, donc dans la variable sss clair0 0Lorsque 0 , enregistrez le premier nombre du plus granddébut de sous-séquences t a r t ; lors de la mise à jour de la réponse, enregistrez le dernier numéro de la plus grande sous-séquencerrr , mettre à jourllen même tempsl。
Code AC:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10010;
int a[N];
int main()
{
int n, x;
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
int ans = -1e9, s = 0;
int start = 0, l, r;
for(int i = 0; i < n; i++)
{
if(s < 0)
{
s = 0;
start = i;
}
s += a[i];
if(s > ans)
{
ans = s;
l = start, r = i;
}
}
if(ans < 0) ans = 0, l = 0, r = n - 1;
printf("%d %d %d", ans, a[l], a[r]);
return 0;
}
Le compte public WeChat «Algorithm Competition Job Search» est dédié à l'explication détaillée des principes et des modèles d'algorithme impliqués dans le concours et la recherche d'emploi. Bienvenue pour faire attention et communiquer et progresser ensemble!