RT:
#include<bits/stdc++.h>
using namespace std;
struct Dts
{
int x;
int v;
}dts[1012];
int sv1[1012][1012],sv2[1012][1012];
bool cmp2(Dts a,Dts b)
{
return a.x>b.x;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>dts[i].x>>dts[i].v;
sort(dts+1,dts+n+1);
for(int i=0;i<=n;i++)
sv1[i][0]=dts[i].v;
sv1[1][1]=dts[1].v;
dts[0]={dts[1].x,0};
for(int i=2;i<=n;i++)
{
int p=i;
for(int j=1;j<=i;j++)
{
while(dts[i-j].x-dts[max(p-1,0)].x<=dts[i].x-dts[i-j].x&&p>=1) p--;
sv1[i][j]=max(max(sv1[i][j-1],sv1[i][j]),sv1[i-j][i-j-p]+dts[i].v);
}
}
sort(dts+1,dts+n+1,cmp);
for(int i=0;i<=n;i++)
sv2[i][0]=dts[i].v;
sv2[1][1]=dts[1].v;
dts[0]={dts[1].x,0};
for(int i=2;i<=n;i++)
{
int p=i;
for(int j=1;j<=i;j++)
{
while(dts[i-j].x-dts[max(p-1,0)].x>=dts[i].x-dts[i-j].x&&p>=1) p--;
sv2[i][j]=max(max(sv2[i][j],sv2[i][j-1]),sv2[i-j][i-j-p]+dts[i].v);
}
}
/*
(X)
int ans=0;
for(int i=0;i<=n;i++)
ans=max(max(sv1[i][i],sv2[i][i]),ans);
cout<<ans;
*/
/*
(Y)
cout<<max(sv1[n][n],sv2[n][n]);
*/
return 0;
}
X 段可以 AC,而 Y 段 WA 36。
拍出的一组数据:
Input:
4
1 1
2 3
4 6
5 10
Output:
(X) 19 / Choice: 4 - 3 - 2
(Y) 17 / Choice: 4 - 3 - 1
所以,Y 段到底哪里出了问题?