这题我采取了两种做法。下面提供两份代码。
前者较为麻烦,但是基于一定的贪心原则, 状态少,效率高。后者写起来方便,速度稍慢。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
typedef long long LL;
const int N=1015,M=4015;
int casenum,casei;
int n,m;
struct A
{
int l,v,h;
bool operator < (const A& b)const {return l<b.l;}
}a[N];
int d[N][M];
LL f[M];
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
int main()
{
scanf("%d",&casenum);
for(casei=1;casei<=casenum;casei++)
{
LL ans=0;
scanf("%d%d",&n,&m);m<<=1;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].l,&a[i].v);
a[i].h=a[i].l;
a[i].l<<=1;
if(a[i].v>ans)ans=a[i].v;
}
sort(a+1,a+n+