PAT.A1007 Suma de subsecuencia máxima

Volver a contenidosInserte la descripción de la imagen aquí

Titulo

Dada una secuencia de números ai, a2 ... an, encuentre i, j (1≤i≤j≤n), de modo que ai + ... + aj sea el mayor, y la suma máxima de salidas y ai, aj.
Si hay múltiples esquemas que maximizan la suma, entonces genere el grupo con los i y j más pequeños.
Si todos los números son menores que 0, entonces la suma máxima se considera 0, y se emiten el primer y el último elemento.

Muestra (se puede copiar)

10
-10 1 2 3 4 -5 -23 3 7 -21
//output
10 1 4

Puntos a tener en cuenta

  1. Este problema utiliza programación dinámica, el problema es la suma máxima de secuencia continua.
  2. Si el punto de prueba 4 no ha pasado, verifique la entrada de todos los números negativos.
  3. Tenga en cuenta que 1 y 4 en la muestra no son subíndices, sino los valores de los puntos inicial y final
#include<bits/stdc++.h>
using namespace std;

const int maxn=10010;
int n,a[maxn],dp[maxn],s[maxn]={0};//a[i]存放序列,dp[i]存放到i为止的最大和,s存放i为止的最大和的起始点
bool flag=false;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
		if(a[i]>=0)flag=true;
	}
	if(!flag){
		cout<<"0 "<<a[0]<<" "<<a[n-1]<<endl;
        return 0;
	}
	dp[0]=a[0];
	for(int i=1;i<n;i++){
		if(dp[i-1]+a[i]>a[i]){
			dp[i]=dp[i-1]+a[i];
			s[i]=s[i-1];
		}else{
			s[i]=i;
			dp[i]=a[i];
		}
	}
	int maxx=0;
	for(int i=1;i<n;i++){
		if(dp[maxx]<dp[i])maxx=i;
	}
	cout<<dp[maxx]<<" "<<a[s[maxx]]<<" "<<a[maxx]<<endl;
    return 0;
}
Publicados 177 artículos originales · ganado elogios 5 · Vistas 6648

Supongo que te gusta

Origin blog.csdn.net/a1920993165/article/details/105589918
Recomendado
Clasificación