MMM 数位dp学习记
数位dp学习记
by scmmm
开始日期
2019/7/17
前言
状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问题(例如旅行商问题),又能体验到空间利用的高效性。
Level 1.模板题
[洛谷] P1896 [SCOI2005]互不侵犯
state 指的是每一行的状态
king 指的是这种情况下国王的个数
难度★★,很好的一个入门题,dp部分:
for(i=1;i<=p;i++)
{
if(king[i]<=m) f[1][i][king[i]]=1;
}
for(i=2;i<=n;i++)
for(j=1;j<=p;j++)
for(k=1;k<=p;k++)
{
if(state[j]&state[k]) continue;
if((state[j]<<1)&state[k]) continue;
if((state[j]>>1)&state[k]) continue;
for(l=1;l<=m;l++)
{
if(king[k]+l>m) continue;
f[i][k][king[k]+l]+=f[i-1][j][l];
}
}
}
P2704 [NOI2001]炮兵阵地
一道考察空间利用的好题,优化方案两个:
1.预处理好每行存在的方案(最大60个),然后f[110,65,65]不会爆空间
2.使用滚动数组,第一行位置1,第二行2,第三行0 结论 第i行为(i+3)%3 (+3是为了防止之后f[i-1]时出现负数)
对于1.特别注意当前状态是state[i,j]而非j(我在这里被卡了好久)
难度★★★,对暴力和预处理有个更好的认识,dp部分:
for(i=1;i<=p[1];i++)
for(j=1;j<=p[2];j++)
{
if(state[1][i]&state[2][j]) continue;
int u=state[2][j],looker=0;
while(u) looker+=u%2,u=u>>1;
f[2][i][j]=max(f[2][i][j],f[1][0][i]+looker);
}
for(i=3;i<=n;i++)
{
for(j=1;j<=p[i];j++)
for(l=1;l<=p[i-1];l++)
{
if(state[i-1][l]&state[i][j]) continue;
for(k=1;k<=p[i-2];k++)
{
if(state[i-1][l]&state[i-2][k]) continue;
if(state[i][j]&state[i-2][k]) continue;
int u=state[i][j],looker=0;
while(u) looker+=u%2,u=u>>1;
f[i][l][j]=max(f[i-1][k][l]+looker,f[i][l][j]);
}
}
}
MMM 数位dp学习记的更多相关文章
- MMM 状压dp学习记
状压dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...
- 数位DP学习笔记
数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...
- 数位DP 学习笔记
前言:鸣谢https://www.luogu.com.cn/blog/virus2017/shuweidp.感谢大佬orz ----------------------------- [引入] 首先要 ...
- FZU 2113(数位dp)
题目连接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=38054 题意:求区间[a,b]中包含'1'的个数. 分析:数位dp ...
- [暑假集训--数位dp]LightOj1205 Palindromic Numbers
A palindromic number or numeral palindrome is a 'symmetrical' number like 16461 that remains the sam ...
- [暑假集训--数位dp]hdu3709 Balanced Number
A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. ...
- [暑假集训--数位dp]hdu2089 不要62
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍, ...
- 数位dp浅谈(hdu3555)
数位dp简介: 数位dp常用于求区间内某些特殊(常关于数字各个数位上的值)数字(比如要求数字含62,49): 常用解法: 数位dp常用记忆化搜索或递推来实现: 由于记忆化搜索比较好写再加上博主比较蒟, ...
- [学习笔记] 数位DP的dfs写法
跟着洛谷日报走,算法习题全都有! 嗯,没错,这次我也是看了洛谷日报的第84期才学会这种算法的,也感谢Mathison大佬,素不相识,却写了一长篇文章来帮助我学习这个算法. 算法思路: 感觉dfs版的数 ...
随机推荐
- 【转】在C#中简单的科学计算,包括幂数,指数,对数,Math类
用Math类进行一些简单的科学计算,包括幂数,指数,对数等的计算: double m,n; m=Math.Exp(0.5); //自然对数e的0.5次方 n=Math.Exp(); //自然对数e的3 ...
- Android零基础入门第78节:四大组件的纽带——Intent
前面学习Activity时己经多次使用了 Intent,当一个Activity需要启动另一个Activity时, 程序并没有直接告诉系统要启动哪个Activity,而是通过Intent来表达自己的意图 ...
- 【备忘】WPF基础
XAML 为了避免生成用户界面(GUI)的代码和基于用户操作执行的代码混合在一起. 名称空间 值得注意的名称空间: xmlns="http://schemas.microsoft.com/w ...
- UI设计师必收!同行总结可即刻上手的iOS规范参考
分享 <关于我> 分享 [中文纪录片]互联网时代 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...
- C#中比较两个对象的地址是否相同(也是引用计数的问题,和Java一样)
private void button1_Click(object sender, EventArgs e) { char[] ch = { 'z', 's', 'w', 'a', 'n', ...
- DUI-分层窗口两种模式(SetLayeredWindowAttributes和UpdateLayeredWindow两种方法各有利弊)
LayeredWindow提供两种模式: 1.使用SetLayeredWindowAttributes去设置透明度, 完成窗口的统一透明,此时窗口仍然收到PAINT消息, 其他应用跟普通窗口一样. 2 ...
- qtablewidget qss加上这个,QHeaderView::section
qtablewidget qss加上这个,QHeaderView::section { color: white; padding: 4px; height:24px; b ...
- STL函数static void (* set_malloc_handler(void (*f)()))()与函数指针解析
在C++ STL的SGI实现版本中,一级空间配置器class __malloc_alloc_template中有一个静态函数的实现如下: static void (*set_malloc_handle ...
- flask(三)
1.cbv的用法 from flask import Flask,views app = Flask(__name__) class Login(views.MethodView ): def get ...
- webstrom sass 关于arguments 和 Output paths to refresh 设置
第一种设置: Arguments:--no-cache --update -t expanded $FileName$:$FileNameWithoutExtension$.css Output pa ...