Red de conocimiento informático - Consumibles informáticos - Un algoritmo para hacerle una pregunta a un experto en programación

Un algoritmo para hacerle una pregunta a un experto en programación

/*Compilación gcc aprobada*/

/*Si hay múltiples opciones para lograr la solución óptima, entonces la selección de ruta de este programa es arbitraria*/

#include

#include

#define MAXL 1000

int mark[MAXL],n <; /p>

int trabajo[MAXL][2];

int ts[MAXL];

int main()

{

int i,j,res;

while(1)

{

/*El número total de indicadores ingresados*/

scanf("%d",&n);

/*Ingrese un número no positivo para salir del programa*/

if(n<=0) break ;

/*Ingrese las puntuaciones de cada bandera por turno*/

for(i=0;i

/*Inicialización*/

memset(ts,0,sizeof(ts));

memset(work,0,sizeof( trabajo));

for(i=0;i

res=0;

/*La matriz work[][0] registra:

Si se debe pasar el indicador i-ésimo, el valor óptimo que se puede lograr al pasar el indicador i-ésimo se registra en work[i] [0]

work[][1] registros:

Para el i-ésimo indicador, el número del indicador anterior que debe pasarse para alcanzar el valor óptimo Si el indicador Es el primer indicador, es decir, no existe ningún indicador anterior que cumpla con la condición, entonces se registra como -1*/

/*La parte central de la programación dinámica*. /

for(i=0 ;i

{

for(j=0;j

if( mark[i]> mark[j] && work[i][0]<=work[j][0] )

/*Una de las dos condiciones es ese j es menor que i, y el otro equivale a encontrar trabajo[ El valor máximo entre 0][0]~work[i-1][0]*/

{

trabajo[i][0]=trabajo[j][0 ];

trabajo[i][1]=j;

}

work[i][0]+=mark[i];/* Se encuentra el valor óptimo y se suma la puntuación del indicador i-ésimo */

if(work[res][0 ]

}

/*

Si debes pasar el indicador i-ésimo, encuentra su valor óptimo, el método es encontrar un indicador con una puntuación menor que el indicador i-ésimo de los indicadores anteriores (de esta manera, el El puntaje por pasar por alto la bandera esta vez debe ser mayor que el puntaje por pasar por alto la bandera la última vez)

esta condición), y

Entre estas banderas que cumplan las condiciones, seleccione la bandera con el valor óptimo más grande como su bandera anterior*/

/*La bandera se exportará en el orden de las banderas*/

i=res;

j=0;

mientras(i!=-1)

{

ts [j] =i;

i=trabajo[ts[j]][1];

++j;

}

/ *Generar la puntuación más alta que se puede lograr*/

printf("%d\n",work[res][0]);

/*La salida debe estar en secuencia Por qué bandera, dado que el número comienza desde 0, todos los números son procesados ​​naturalmente por +1*/

printf("%d",ts[j-1]+1);

for(i=j-2;i>=0;--i) printf(" %d",ts[i]+1);

printf("\n");

}

devuelve 0;

/*

Entrada de muestra:

7

1 10 2 9 3 8 4

Salida de muestra:

14

1 3 5 6

Aquí también hay aprendizaje dinámico información de programación, espero que te sea de ayuda

/bmzc/person/hwl/ao_sai/jsfd/dtgh3.htm

*/

}