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
);
}
这种要求规划决策取最大方案的题不应该很快想到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
);
}
相关文章推荐
- 2017.9.6 Robot 失败总结
- JDBC连接失败大总结
- 2017.10.23 硬币购物 失败总结
- 国内某家家教网站站长的创业自述,前人的失败总结
- 多年老站长历经失败后总结经验篇
- 2017.9.8 线性代数 失败总结
- 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结
- 从银行转账失败到分布式事务:总结与思考
- CocoStudio可滚动层裁剪失败总结
- 2017.9.29 road 失败总结
- 两年手游创业失败的总结
- 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结
- vs2008 安装失败的总结与分享
- cj搜索算法-魔版(打表术失败总结)
- ssh 免密码设置失败原因总结
- 失败的处女面暨CVT一面总结
- 一个创业失败的大学生亲身总结11条原因
- Mysql文件太大导入失败解决办法总结
- (转载)两年手游创业失败的总结
- 一次失败的模型设计的总结