您的位置:首页 > 其它

2017.9.21 problem a 失败总结

2017-09-21 20:04 183 查看
zz到怀疑人生、

这种要求规划决策取最大方案的题不应该很快想到dp二分网络流吗、怎么还在乱搞、

首先做这种题需要把题目中的抽象的信息量化

首先简单容斥:取说真话最多的(←而已经好几次无视简单容斥了)

然后一个人说的话可以这么理解:

1、如果它判定为真,则剩下的左右位置已经确定,,注意和他本身相同的数也已经确定

2、如果比他小比他大的数加起来>=n,一定是假

但知道这一些是基本没用的,因为左右位置是两个方向,它会涉及到真假的决策,也会造成不同影响

,所以这种方法是需要dfs的

而如果利用剩下的左右位置确定自己的位置,则自己的位置是一个区间,那就变成了区间选取的题目,就好做多了

(↑极为巧妙,把题目中提炼出得信息取个反,会有奇效。。 )

然后就是匹配了。注意相同的边个数需要保证、

注意有些题目的条件是对其他元素的限制,这是可以考虑将它对别人的限制转化为对自身的限制,这样每个都独立就不会有后效性了

另注意继承的思想在dp中的应用,如果当前决策有不选,就可以和前一个状态相等

这题就是转化的十分巧妙、利用位置总数和大小关系来确定自己的范围,那限制就是不重叠,就转化为经典问题

如果是对别人的限制考虑,那就相当于左右区间不重叠,图就会很乱, 就很难再想下去了。

码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100005
struct ren{
int l,r;
}a
;
int cnt,f
,i,j,jishu,x,y,n;
bool cmp(ren a,ren b)
{
return (a.r==b.r)?a.l<b.l:a.r<b.r;
}
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(x+y>=n)continue;
a[++cnt].l=x+1;
a[cnt].r=n-y;
}
sort(a+1,a+1+cnt,cmp);
j=1;
for(i=1;i<=n;i++)
{
f[i]=f[i-1];
while(a[j].r<i)j++;
for(;a[j].r==i;j++)
{
if(a[j].l==a[j-1].l)jishu++;else jishu=1;
f[i]=max(f[i],f[a[j].l-1]+min(jishu,i-a[j].l+1));
}
}
printf("%d",n-f
);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: