caioj1496: [视频]基于连通性状态压缩的动态规划问题:Manhattan Wiring
%%%%orz苏大佬 虽然苏大佬的baff吸不得,苏大佬的梦信不得,但是膜苏大佬是少不得的囧
这题还是比较有收获的 哼居然有我不会做的插头DP
自己yy了下,2表示属于2的插头,3表示3的插头
假如当前是0点,并且没有左上连向,那么可以不放插头,也可以放2放3,否则就是常规操作
假如是障碍那就不能有插头
然后假如是2和3点,就可以放个单插头,或者直接继承前面的插头
我觉得很OK啊。。。然后就不会记录ans了
????黑人问号啊,怎么判是否结束了啊
写了各种异或判断是否当前状态把四个位置都放了,然后。。就只能过这个↓
2 3
2 2 0
0 3 3
直接去%苏大佬的code,发现她是这么写的:
ans=;
work();
for(int i=;i<=dp[now].size;i++)
{
ans+=dp[now].num[i];//将所有可行的方案加入ans
}
printf("%lld\n",ans>?ans-:);
她怎么能直接把状态的最小值累加啊???
调试了一下发现,这个栈里面的元素要么只有一个要么没有要你这个for何用啊
彻底懵逼。。直接去膜拜 终于懂了
是因为到最后肯定只有一个状态,就是0(也就是匹配完成),假如不匹配完成那么就不会成功继承。
那我现在的感觉是其他题是不是也一样?假如我让它不合法就不继承好像可以一样做欸
upd:我在做下一题的时候发现我好像沙茶了,因为每道题情况不一样,对于这题而言,它不需要形成回路,并且可以有空格不行经,使得它在转移的时候可以空转移,所以能够无需特判直接转移到末尾
整理下思路,一开始我想的是分开算2和3的长度,这个很难实现,因为它们不相交所以我只需要求放了插头的位置数就行了,对于继承答案可以直接转移到最后一个位置,中途继承判合法就行了
为什么每次写s=set_bracket(s,j,q);都特别想笑。。。我也想把LCT改成YZH
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL mod=; int n,m;
int mp[][];
struct node
{
LL mn[];
int top;LL hash[],sta[];
void pha(int s,LL mmin)
{
int x=s%mod;
while(hash[x]!=&&sta[hash[x]]!=s)x=(x+)%mod;
if(hash[x]==)sta[++top]=s,hash[x]=top;
mn[hash[x]]=min(mn[hash[x]],mmin);
}
void clean()
{
top=;
memset(mn,,sizeof(mn));
memset(hash,,sizeof(hash));
}
}dp[];
LL get_bracket(LL s,LL p)
{
return (s>>((p-)*))&;
}
LL set_bracket(LL s,LL p,LL v)
{
s^=(get_bracket(s,p)<<((p-)*));
s^=(v<<((p-)*));
return s;
}
int pre,now;
void Plug_DP()
{
pre=,now=;
dp[now].clean();dp[now].pha(,);
for(LL i=;i<=n;i++)
{
for(LL j=;j<=m;j++)
{
swap(pre,now);dp[now].clean();
for(int k=;k<=dp[pre].top;k++)
{
LL s=dp[pre].sta[k],mn=dp[pre].mn[k];
LL p=get_bracket(s,j),q=get_bracket(s,j+); if(mp[i][j]==)
{
if(p==&&q==)dp[now].pha(s,mn);
}
else if(mp[i][j]==)
{
if(p==&&q==)
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,);
dp[now].pha(s,mn);
if(mp[i][j+]!=&&mp[i+][j]!=)
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,);
dp[now].pha(s,mn+);
s=set_bracket(s,j,);
s=set_bracket(s,j+,);
dp[now].pha(s,mn+);
}
}
else if(p==&&q>)
{
if(mp[i+][j]!=)
{
s=set_bracket(s,j,q);
s=set_bracket(s,j+,);
dp[now].pha(s,mn+);
}
if(mp[i][j+]!=)
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,q);
dp[now].pha(s,mn+);
}
}
else if(p>&&q==)
{
if(mp[i+][j]!=)
{
s=set_bracket(s,j,p);
s=set_bracket(s,j+,);
dp[now].pha(s,mn+);
}
if(mp[i][j+]!=)
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,p);
dp[now].pha(s,mn+);
}
}
else if(p>&&q>)
{
if(p==q)
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,);
dp[now].pha(s,mn+);
}
}
}
else
{
if(p==&&q==)
{
if(mp[i][j+]==||mp[i][j+]==mp[i][j])
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,mp[i][j]);
dp[now].pha(s,mn+);
}
if(mp[i+][j]==||mp[i+][j]==mp[i][j])
{
s=set_bracket(s,j,mp[i][j]);
s=set_bracket(s,j+,);
dp[now].pha(s,mn+);
}
}
if((p==&&q==mp[i][j])||(p==mp[i][j]&&q==))
{
s=set_bracket(s,j,);
s=set_bracket(s,j+,);
dp[now].pha(s,mn+);
}
}
}
}
for(int k=;k<=dp[now].top;k++)
dp[now].sta[k]<<=;
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)break;
memset(mp,,sizeof(mp));
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]==||mp[i][j]==)mp[i][j]^=;
}
}
Plug_DP();
printf("%lld\n",(dp[now].top==)?:(dp[now].mn[]-));
}
return ;
}
caioj1496: [视频]基于连通性状态压缩的动态规划问题:Manhattan Wiring的更多相关文章
- caioj1495: [视频]基于连通性状态压缩的动态规划问题:Formula 2
本来想写一天插头的,但是这题太难受(绝望)500+的代码量..我选择下午放松一下. 先ORZ一下苏大佬(yz的cdq啊%%%%%)居然把cdq论文里面的题抠出来出数据放在c站(呵呵真是个悲伤的故事不过 ...
- 插头DP(基于连通性状态压缩的动态规划问题)(让你从入门到绝望)
今天,我,Monkey king 又为大家带来大(ju)佬(ruo)的算法啦!--插头DP 例题(菜OJ上的网址:http://caioj.cn/problem.php?id=1489): 那么,这道 ...
- 【BZOJ2734】【HNOI2012】集合选数(状态压缩,动态规划)
[BZOJ2734][HNOI2012]集合选数(状态压缩,动态规划) 题面 Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所 ...
- 【NOIP2017】宝藏(状态压缩,动态规划)
[NOIP2017]宝藏(状态压缩,动态规划) 题面 洛谷 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路 ...
- 洛谷P2258 子矩阵 题解 状态压缩/枚举/动态规划
作者:zifeiy 标签:状态压缩.枚举.动态规划 题目链接:https://www.luogu.org/problem/P2258 这道题目状态压缩是肯定的,我们需要用二进制来枚举状态. 江湖上有一 ...
- HOJ-2662Pieces Assignment(状态压缩,动态规划)
Pieces Assignment Source : zhouguyue Time limit : 1 sec Memory limit : 64 M Submitted : 415, Accepte ...
- 【NOI2001】炮兵阵地(状态压缩,动态规划)
题面 题面中有图片的存在,所以就贴个地址把 题解 简单题,,,, 原来一直觉得不会做... 现在发现是一道傻逼题 暴力压两行的状态 发现就需要滚一维. 然后暴力检查一下状态的可行性 DP检查MAX就可 ...
- 【BZOJ1087】【SCOI2005】互不侵犯(状态压缩,动态规划)
题面 这种傻逼题懒得粘贴了... 题解 傻逼题 \(f[i][j][k]\)表示当前第\(i\)列,当前放置状态为\(j\),已经放了\(k\)个 暴力判断状态合法性,暴力判断转移合法性,然后统计答案 ...
- HDU-4539郑厂长系列故事——排兵布阵(状态压缩,动态规划)
郑厂长系列故事--排兵布阵 Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total ...
随机推荐
- Nginx实现负载均衡 + Keepalived实现Nginx的高可用
前言 使用集群是大中型网站解决高并发.海量数据问题的常用手段.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求 ...
- ASP.NET MVC上传文件 未显示页面,因为请求实体过大。解方案
在Dropzone中设置 maxFilesize: 350, //MB 但上传的文件没有到最大限定350MB,就报出来 未显示页面,因为请求实体过大的错误 Web.config中设置 maxAl ...
- SqlServer执行存储过程时,参数值为null,sql语句参数值变成default
从C#代码里传入参数到调用存储过程,参数的值为null,执行存储过程一直提示需要参数 '@xxx',但未提供该参数.通过profiler发现生成的参数值变成为default. 解决方案:1.将Para ...
- TopN问题(分别使用Hadoop和Spark实现)
简介 TopN算法是一个经典的算法,由于每个map都只是实现了本地的TopN算法,而假设map有M个,在归约的阶段只有M x N个,这个结果是可以接受的并不会造成性能瓶颈. 这个TopN算法在map阶 ...
- 初学 Ajax(涉及 php)
一直知道 ajax 但是尚未真正了解, 这次看了慕课网的<Ajax全接触>,算是有所收获,入了个门. 需要用到php,因为 Ajax也是向服务器请求(不知道这么解释对不对), 所以还需要配 ...
- JDK和Cglib实现动态代理实例及优缺点分析
Spring AOP使用的核心技术是动态代理,说到动态代理就不得不和设计模式中的代理模式联系起来,通过代理模式我们可以对目标类进行功能增强,在某个方法的执行前后增加一些操作,例如计算方法执行效率.打印 ...
- LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)
LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...
- 【转载】java调用C++写的DLL
用java调用C++写的DLL一直以来都是一个比较麻烦但又很常见的问题. 我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的. 如果有一个现有的 .dll/.so 文件,如 ...
- java控制台输入输出字符串
一.实例说明 本实例通过输入流(System.in)实现从控制台接受用户输入信息,并将该信息输出到控制台. 运行效果如下图: 二.实现代码 三.要点说明 该实例的关键就是用到了System类的输入流, ...
- 如何防范自己的IP泄漏
在正式进行各种“黑客行为”之前,黑客会采取各种手段,探测(也可以说“侦察”)对方的主机信息,以便决定使用何种最有效的方法达到自己的目的.来看看黑客是如何获知最基本的网络信息——对方的IP地址:以及用户 ...