问题描述
给出在数轴上的n条线段的左右端点的坐标l,r和它们的价值v,请你选出若干条没有公共点的线段(端点重合也算有公共点),
使得它们的价值和最大,输出最大价值和。
输入格式
第一行一个正整数n。
接下来n行,每行三个整数l,r,v分别表示一条线段的左端点,右端点和价值。l<r,v>0。
输出格式
输出一个整数表示最大价值和。
样例输入
4
1 3 4
3 5 7
5 7 3
2 6 8
样例输出
8
暴力搜。。。
#include <stdio.h>
int n;
int left[2000];
int right[2000];
int value[2000];
int i;
int k;
int max,FRE,sum;
int address[2000];
int search(int ori,int fre)
{
int j;
int sums=0;
if(fre==0)
{
i=0;
for(j=0;j<FRE;j++)
{
sums+=value[address[j]];
if(sums>sum)
{
if(judge(FRE)==1)
{
sum=sums;return 1;
}
else return 0;
}
}
return 0;
}
else
{
for(j=ori;j<n-(fre-1);j++)
{
address[i]=j;i++;
search(ori+1,fre-1);
}
}
}
int judge(int x)
{
int x1,x2,result;
for(x1=0;x1<x-1;x1++)
for (x2=0;x2<x;x2++)
if(!((left[address[x1]]>right[address[x2]])||(left[address[x2]]>right[address[x1]])))return 0;
return 1;
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d %d %d",&left[i],&right[i],&value[i]);
max=0;
for(FRE=1;FRE<n;FRE++)
{
i=0;
search(0,FRE);
//if judge, compute value
}
printf("%d\n",sum);
return 1;
}