Динамическое программирование (организация мероприятий)

Задача состоит в том, чтобы рассчитать максимальную стоимость, которая возможна для периода времени 48 часов, путем выбора введенных заказов. Заказы выбираются таким образом, чтобы они не перекрывались.

например, если вход выглядит следующим образом

4

1 2 100

2 3 200

3 4 1600

1 3 2100

Тогда на выходе будет 3700, выбрав последние 2 события.

Обратите внимание, что в случае перекрывающихся событий должно быть выбрано только то событие, которое приведет к максимальной стоимости.

вход

Первая строка ввода содержит целое число T — количество тестов. Следующие тесты Первая строка теста содержит целое число N — количество полученных заказов на проведение событий. Каждая из следующих N строк содержит три целых числа Si, Ei, Ci, разделенных пробелом, — параметры i-го события, описанные в постановке задачи.
Ограничения

1 ≤ T ≤ 10

1 ≤ N ≤ 2000

0 ≤ Si < Ei ≤ 48

0 ≤ Ci ≤ 10 ^ 6

Выход

Выходные данные для каждого теста должны содержать одно целое число в отдельной строке, максимально возможная стоимость.

Это стандартная проблема DP. Вот мой код. Я проверил все возможные тестовые случаи, о которых мог подумать, но когда я отправляю этот код онлайн-судье, в результате я получаю неправильный ответ. Пожалуйста, помогите.

#include<iostream>
#include<stdio.h>
using namespace std;
unsigned long long A[50][50];
int main()
{
int t,m,S,E,C,i,j;
unsigned long long cost;

scanf("%d",&t);
while(t--)
{

int n=-1;scanf("%d",&m);

for(i=0;i<50;++i)
for(j=i;j<50;++j)
A[i][j]=0;

while(m--)
{

scanf("%d%d%d",&S,&E,&C);
A[S][E]=C;
if(E>n)
n=E;
}

for(int l=2;l<=(n+1);++l)
{
for(i=0;i<=(n-l+1);++i)
{
j=i+l-1;

for(int k=i;k<=j;++k)
{
cost=A[i][k]+A[k][j];
if(cost>A[i][j])
{
A[i][j]=cost;

}
}
}
}
cout<<A[0][n]<<endl;}

}

0

Решение

Вы не учли следующее:
Обратите внимание, что в случае перекрывающихся событий следует выбирать только событие, которое приведет к максимальной стоимости

Логика, которую вы использовали, верна.

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
unsigned long long A[50][50];
int main()
{
int t,m,S,E,C,i,j;
unsigned long long cost;

scanf("%d",&t);
while(t--)
{

int n=-1;scanf("%d",&m);

/*for(i=0;i<50;++i)
for(j=i;j<50;++j)
A[i][j]=0;
*/
memset(A,0,sizeof(A));

while(m--)
{

scanf("%d%d%d",&S,&E,&C);
A[S][E]= (C>A[S][E])?C:A[S][E];
if(E>n)
n=E;
}

for(int l=2;l<=(n+1);++l)
{
for(i=0;i<=(n-l+1);++i)
{
j=i+l-1;

for(int k=i;k<=j;++k)
{
cost=A[i][k]+A[k][j];
if(cost>A[i][j])
{
A[i][j]=cost;

}
}
}
}
cout<<A[0][n]<<endl;}

}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]