/* Polygon (IOI 1998) Copyright (C) 2000 Sebastiano Vigna This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Utilizziamo la programmazione dinamica per calcolare i massimi e minimi valori ottenibili con una sottoespressione che coinvolge i vertici a partire dal vertice j. Per fare cio` basta utilizzare i valori estremali delle possibili coppie di sottoespressioni di lunghezza k e i-k che partono dal vertice j e dal vertice j+k, rispettivamente. E` necessario calcolare i massimi e i minimi perche' per massimizzare un prodotto bisogna considerare il caso che un fattore sia negativo. */ #include #include #include #include #include #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) #define MAXN 50 /* Massimo numero di vertici. */ char op[MAXN]; /* Operatore che compare _prima_ del vertice corrispondente. */ int n[MAXN]; /* Intero sul vertice */ long massval[MAXN][MAXN]; /* Matrice da riempire dinamicamente: il primo indice e` la lunghezza della sottoespressione da massimizzare, il secondo il vertice da cui parte l'espressione. */ long minval[MAXN][MAXN]; /* Come sopra per i minimi. */ int tempn[MAXN]; char tempop[MAXN]; /* In queste matrici ricopieremo op e n a meno del primo lato eliminato e di rotazioni cicliche. */ long M[MAXN]; /* Massimo ottenibile rimuovendo inizialmente un certo lato. */ int main(int argc, char *argv[]) { int i, j, k, l, N; char *t; long p = 0, tmax, tmin, ottimo; scanf("%d\n", &N); for(i=0; i