Задача состоит в том, чтобы рассчитать максимальную стоимость, которая возможна для периода времени 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;}
}
Вы не учли следующее:
Обратите внимание, что в случае перекрывающихся событий следует выбирать только событие, которое приведет к максимальной стоимости
Логика, которую вы использовали, верна.
#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;}
}
Других решений пока нет …