【2017 特长生】【DP】 摆渡线路
题目
解题思路
一般来说,这种圆的题都要拆成串来做
由题意得,没有交叉部分的线段,在圆中可以同时保留
可以想到区间DP
枚举区间长度,然后枚举中点
以这个区间边界为端点的线段肯定是保留的,记得加上
代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,x,y,ans,a[230][230],f[230][230];
int main()
{
freopen("line.in","r",stdin);
freopen("line.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if (x>y) swap(x,y);
a[x][y]=1;
a[x+100][y+100]=1;
}
for (int i=1;i<=100;i++) //枚举长度
{
for (int j=1;j+i-1<=200;j++) //枚举左端
{
for (int k=j;k<=j+i-1;k++) //枚举中点
f[j][j+i-1]=max(f[j][j+i-1],f[j][k]+f[k][j+i-1]); //更新最值
f[j][j+i-1]+=a[j][j+i-1]; //以此为端点的线段统计进去
}
}
for (int i=1;i<=100;i++)
ans=max(ans,f[i][i+100-1]);
printf("%d",ans);
return 0;
}