Polygon Games - интервал дп

Название Описание

Многоугольники (Многоугольник) является одиночная игра, чтобы играть в игру, начало данного многоугольника, состоящего из N вершин (в примере, показанном на фиг. 1, N = 4), каждая вершина присваивается целое значение, и каждый края были даны символ + (операция сложения), или * (умножение), последовательно со всех сторон целое число от 1 до N идентификации.образ

Рисунок 1: графическое представление многоугольника первого движения (первый ход), будут удалены, чтобы один край; каждый последующий сдвиг последовательности (subsequentmoves), включающие в себя следующие этапы:

1, выберите ребро Е, а вершина Е V1 и V2 с помощью муфты;

2, с новой вершиной, ребро Е и замещенные две вершины V1 и V2 подсоединены. Новые вершины, чтобы получить новое значение, это значение V1 и V2, обозначенные как Е, состоящие расчетным путем, полученные результаты.

После того, как все ребра были удалены, оставляя только вершину, игра заканчивается. Игра оценка является значение вершины. Ниже приведен пример игры: многоугольник рассмотрим рисунок 1.

Первый шаг игроков , чтобы удалить статью 3 стороны. Результаты , показанные на рис. образ Фигура 2 стороны удаление статьи 3

После этого игроки удаления статьи 1 кромка  образ 3 1 сторона исключения статьи

Затем удалите статью четвертую сторону,  образ фиг. 4 исключить статью 4 стороны

И, наконец, исключение статьи 2 -х сторон. Счет равен 0.  На образ фиг 5 второй боковой секции , чтобы удалить задание: написать программу, для любого заданного многоугольника, расчет максимально возможный балл, и может включать в себя все результаты в высокий балл перемещается край первым.

Формат ввода

POLYGON.IN файл дан, многоугольник N вершин. Файл, содержащий 2 строки: первая запись строки является значение N (N <= 50); второй ряд содержит все символы сторон (1, ..., N), приведены, и установлены в вершине между двумя сторонами значение (значение, соответствующее целому числу 1, 2 вершин одновременно подключены к стороне; второе целое число, соответствующее числу 2, 3 вершин при подключении к стороне; ...;., и т.д. Наконец, значение, соответствующее N число, в то время как номер, прикрепленный к одной стороне вершины), а значения между символами, разделенных пробелом. Есть две стороны символа: буква Т (соответствует +), буквы х (соответствующие *).

Формат вывода

В первой строке файла POLYGON.OUT, ваша программа должна вывести наибольшее количество очков во входном файле указаны условия могут получить. Если некоторые ребра удаляются в первый ход, это может привести к наивысшим баллом. Во второй строке выходного файла, такие требования включают в себя все стороны, и выход в порядке возрастания, разделенный промежуток между ними.

образец

ввод пробы

4
t -7 t 4 x 2 x 5

Пример вывода

33
1 2

Диапазон данных и советы

Ввод пробы соответствует многоугольника, показанного на фиг. Первый символ второй строки является символом номер 1 сторона.

Эта проблема были объединены Аналогично камни, превращена в полигон циклической цепи, н в 2 * N + 1 символов.

Общее число не может быть изменен, так что немного идет немного назад;

Один цикл раньше, мы решили удалить этот край плюс п, идет назад;

F [I] [J], представляет собой оптимальное решение от I до J;

Каждая точка должна состоять из двух точек, таким образом, в I, интервалы точки J Перечисление деления, внимание не равное деление точки J;

Потому что эта проблема, номера имеют как положительные, так и отрицательные, должны будут рассмотреть случай отрицательного делает положительный

Например, -1000 -1000 * 100 * 100 = 1 миллион и один миллион = 10000> 10000, но имеет менее 100 -1000;

Таким образом, каждый раз, когда слияние обязано рассмотреть минимальные и максимальные значения;

Если следующее слияние, символ «+», непосредственно добавляя максимальные и минимальные значения;

Если «*», то это будет большим * большим * немного большим, маленькое * большое и маленьким * Сравнение четырех немного, глядя на максимальный и минимальный;

 

 

код

#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <CString> 
#include <алгоритм>
 с помощью  пространства имен STD;
INT п, шу [ 150 ], F [ 150 ] [ 150 ] [ 3 ], сумма [ 150 ] [ 150 ], FF [ 150 ] = { 0 }, MA, MB, а, б, в, г;
символ фу [ 150 ];
INT основных () 
{ 
    CIN >> п;
    для ( INT I = 1 ; г <= п; я ++ )
    { 
        CIN >> фу [я] >> шу [я]; // 先输入符号,在输入数字
    }
     для ( INT I = п + 1 ; г <= 2 * п; я ++ ) 
    { 
        шу [I] = шу [i - п]; 
        фу [I] = фу [i - п]; 
    } 
    Для ( INT I = 1 ; г <= п; я ++ ) 
    { 
        для ( INT о = 1 ; о <= 2 * п; о ++ ) 
        { 
            для ( Int р = 1 ; р <= 2п- *; Р ++ ) 
            { 
                F [O] , [Р] [ . 1 ] = - 9999999 ; // найти большое значение, минимальное инициализацию 
                F [O] [P] [ 2 ] = 9999999 ; // найти небольшое значение, инициализация максимума 
            } 
        } 
        для ( INT Q = 1. , Q <= 2 * н-, Q ++) // инициализация раздела ДП 
        { 
            F [Q] [Q] [ 1. =] Шу [Q]; 
            F [Q] [Q] [ 2 ] = Шу [Q];
             ЕСЛИ (ФУ [Q + . 1 ] == ' Т ') 
            { 
                F [Q] [д + 1 ] [ 1 ] = шу [Q] + шу [д + 1 ]; 
                F [Q] [д + 1 ] [ 2 ] = шу [Q] + шу [д + 1 ]; 
            } 
            Если (фу [д + 1 ] == ' х ' ) 
            { 
                F [Q] [д + 1 ] [ 1 ] = шу [Q] * шу [д + 1 ]; 
                F [Q] [д + 1 ] [ 2 ] = шу [Q] * шу [д + 1 ]; 
            }
        } 
        для( Int L = 2 , L <= п, L ++ ) 
        { 
            для ( Int J = I, J <= I + NL; j ++ ) 
            { 
                INT K = J + L - 1. ,
                 Для ( INT X = J, X <К , X ++) // должно быть меньше , чем к, потому что х + 1 сзади; 
                {
                     ЕСЛИ (ФУ [X + 1. ] == ' Т ' && Р [J] , [К] [ 1. <Р [J] , [Х] [] 1. ] + Ж [Х + . 1 ] [K] [ . 1 ]) F [J] , [К] [ . 1 ] = Р [J] , [Х] [ . 1 ] + Ж [Х + . 1] [к] [ 1 ];
                    если (фу [х + 1 ] == ' т ' && F [J] [K] [ 2 ]> F [J] [х] [ 2 ] + ж [х + 1 ] [к] [ 2 ]) П [J] [к] [ 2 ] = F [J] [х] [ 2 ] + ж [х + 1 ] [к] [ 2 ];
                    если (фу [х + 1 ] == ' х ' ) 
                    { = F [J] [х] [ 1 ] * е [х + 1 ] [к] [ 1 ]; 
                        б = F [J] [х] [2 ] * е [х + 1 ] [к] [ 1 ]; 
                        с = F [J] [х] [ 1 ] * е [х + 1 ] [к] [ 2 ]; 
                        d = F [J] [х] [ 2 ] * е [х + 1 ] [к] [ 2 ]; 
                        F [J] [K] [ 1 ] = макс (макс (макс (а, б), не более (в, г)), F [J] [K] [ 1 ]); 
                        F [J] [K] [ 2 ] = мин (мин (мин (а, б), мин (в, г)), F [J] [K] [ 2 ]); 
                    } 
                } 
            } 
        } И 
        далее [I] = F [г] [г + п-1] [ 1 ]; 
    } 
    Ма = - 1000000 ;
    для ( INT I = 1 ; г <= п; я ++) // 寻找最大值
    {
         если (ма < далее [я]) 
        { 
            ма = FF [I]; 
            Мб = я; 
        } 
    } 
    СоиЬ << ма << епсИ;
    для ( INT I = 1 ; г <= п; я ++ ) 
    { 
        если (Н [я] == ма) 
        { 
            соиЬ << I <<"  " ; // выход может быть выключен несколько первых 
        } 
    } 
} 
/ * 
4 120. 
Х Х 2 Х 4. 3. 1 х 2. 5. 4. 3 


6 10000. 
X X -10 -10 -10 · 10 Т 10 Т 10 Т. 6 


7 300000. 
х -10 х -10 х -10 х -10 т 10 т 10 т 10 5 
или более три набора тестовых данных * /    

 

 

рекомендация

отwww.cnblogs.com/fengwu2005/p/11289562.html
рекомендация