D e s c r i p t i o n Description Description
有n个窗口
你想在这n个窗口中取菜
你可以在
A
[
i
]
A[i]
A[i]~
B
[
i
]
B[i]
B[i]中取菜
取了就必须把所有的取了
但是你不能重复在某个窗口取菜
问最多可以去多少菜
I n p u t Input Input
一个数,m
第2~m+1行,每行两个数,
A
[
i
]
A[i]
A[i]、
B
[
i
]
B[i]
B[i]
O u t p u t Output Output
一个数,最多能去多少
S a m p l e I n p u t Sample Input SampleInput
3
1 3
7 8
3 4
S a m p l e O u t p u t Sample Output SampleOutput
5
思路
DP
将
B
[
i
]
B[i]
B[i]排一遍
然后
F
[
i
]
=
m
a
x
(
F
[
i
−
1
]
,
F
[
A
[
j
]
−
1
]
+
(
B
[
j
]
−
A
[
j
]
+
1
)
)
F[i]=max(F[i-1],F[A[j]-1]+(B[j]-A[j]+1))
F[i]=max(F[i−1],F[A[j]−1]+(B[j]−A[j]+1))
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct whw
{
int Start,End;
}A[2250];
int F[2250];
int n,m;
bool Nm(whw i,whw j)
{return i.End<j.End;}
int main()
{
// freopen("hunger.in","r",stdin);
// freopen("hunger.out","w",stdout);
scanf("%d",&m);
for(int i=1;i<=m;++i)
{
scanf("%d%d",&A[i].Start,&A[i].End);
n=max(n,A[i].End);
}
sort(A+1,A+m+1,Nm);//排序
for(int i=A[1].End;i<=n;++i)
{
F[i]=F[i-1];//
for(int j=1;j<=m;++j)
{
if(A[j].End>i)break;//如果超过了
F[i]=max(F[i],F[A[j].Start-1]+(A[j].End-A[j].Start+1));
}
}
printf("%d",F[n]);
fclose(stdin);
fclose(stdout);
return 0;
}