培训期间做题整理(部分)
讲了很多题,把做了的分类整一下?
dp部分
1.bzoj2298
这道题有一个很神的思路。就是说把每个人成绩的范围看成一条线段,然后dp求不重叠的覆盖。记得相同的边要合并一下,记录为边的权值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,f[100010],cnt;
struct Node
{
int l,r;
}e[100010];
bool cmp(Node a,Node b)
{
if(a.r==b.r)
return a.l<b.l;
else
return a.r<b.r;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(a+b>=n)
continue;
e[++cnt].l=a+1;
e[cnt].r=n-b;
}
sort(e+1,e+1+cnt,cmp);
int j=1;
for(int i=1;i<=n;i++)
{
f[i]=f[i-1];
while(e[j].r<i)
j++;
int tot=0;
while(e[j].r==i)
{
if(e[j].l==e[j-1].l)
tot++;
else
tot=1;
f[i]=max(f[i],f[e[j].l-1]+min(i-e[j].l+1,tot));
j++;
}
}
cout<<n-f[n];
return 0;
}