[Ural1519] Formula 1

2024-01-17 03:50
文章标签 formula ural1519

本文主要是介绍[Ural1519] Formula 1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description
  给出 nm n ∗ m 的方格,有些格子不能走,其它格子必须走,形成一个闭合回路。问有多少种走法?
  ( n12 n ≤ 12 m12 m ≤ 12 )

Solution
  插头DP辣!!!(练习板子题
  一年前就听说这个东西,然后觉得太强了不敢学 qwq q w q ,我好菜菜啊。
  
  终于在这篇好博客的指引下:戳我戳我:),学习到了什么是插头DP。
  可以看上面那个大佬的博客入门很好哒!本白菜以为那位大佬讲的和写的不太一样啊,就自己按照讲的做法写了一个,可以对!
  
  主要思想就是括号表示法插头的转移。似乎还有一个做法是“最小表示法”,但是括号的相比起来又快又方便写。插头转移的话就去看一下连到自己的插头的情况分类讨论即可。
  还有一个小地方就是我们本来是三进制的,为了快,改成了四进制。然后状态就要用 hash h a s h 表存了。

  复杂度大约是 O(3mnm2) O ( 3 m n m 2 ) ??但是绝对满不了,有很多无用状态。

Other
  扩展一下求哈密顿路径怎么办? cdq c d q 说我们再加一个插头状态,就是“独立插头”?(原来是“没有插头”“左括号插头”“右括号插头”),似乎有一点道理??
  独立插头大概意思应该是有那么一个插头它的另一端挂在上面不会下来了,所以它没有另一端,既不是左括号也不是右括号。假设你现在顺次有一个右括号和一个独立插头,你使右括号和独立插头连在一起,你要去找那个前面与这个右括号匹配的左括号,把它改成独立插头。当然还有别的几种情况要考虑。(一顿瞎BB还觉得自己很有道理

  留坑,什么时候回来写一下试试。
  
  (图扔上来就跑 qwq q w q
  

Source

//2018-4-26
//miaowey
//
//Ural1519 
//Count the number of Hamilton circuit
//
#include <bits/stdc++.h>
using namespace std;#define LL long long
#define For(i, a, b) for(int i = (a); i <= (int)(b); ++i)
#define Forr(i, a, b) for(int i = (a); i >= (int)(b); --i)#define N 15
#define M 300000
const int P = 1e6 + 3;char rs[N];LL ans, f[2][M];
int n, m, ex, ey, o, tot[2], mp[N][N], zt[2][M], bit[N];int en, head[P], nxt[M], to[M];void Insert(int now, LL nval){int t = now % P;for(int i = head[t]; i; i = nxt[i])if(zt[o][to[i]] == now){f[o][to[i]] += nval; return;}++tot[o];to[++en] = tot[o]; nxt[en] = head[t]; head[t] = en;zt[o][tot[o]] = now; f[o][tot[o]] = nval;
}void PlugDp(){For(i, 1, 12) bit[i] = i << 1;o = 0; tot[o] = 1; f[o][1] = 1; zt[o][1] = 0;For(i, 1, n){For(j, 1, tot[o]) zt[o][j] <<= 2;For(j, 1, m){en = 0; memset(head, 0, sizeof head);tot[o ^= 1] = 0;For(k, 1, tot[o ^ 1]){int now = zt[o ^ 1][k]; LL nval = f[o ^ 1][k];int dw = (now >> bit[j]) & 3, ri = (now >> bit[j - 1]) & 3;if(!mp[i][j]){if(!dw && !ri) Insert(now, nval);}else if(!dw && !ri){if(mp[i][j + 1] && mp[i + 1][j]) Insert(now + (1 << bit[j - 1]) + 2 * (1 << bit[j]), nval);}else if(!dw && ri){if(mp[i][j + 1]) Insert(now - ri * (1 << bit[j - 1]) + ri * (1 << bit[j]), nval);if(mp[i + 1][j]) Insert(now, nval);}else if(dw && !ri){if(mp[i + 1][j]){Insert(now - dw * (1 << bit[j]) + dw * (1 << bit[j - 1]), nval);}if(mp[i][j + 1]) Insert(now, nval);}else if(dw == 1 && ri == 1){int cnt = 0;For(u, j + 1, m){int t = (now >> bit[u]) & 3;if(t == 1) ++cnt; else if(t == 2) --cnt;if(cnt == -1){Insert(now - (1 << bit[u]) - (1 << bit[j - 1]) - (1 << bit[j]), nval);break;}}}else if(dw == 2 && ri == 2){int cnt = 0;Forr(u, j - 2, 0){int t = (now >> bit[u]) & 3;if(t == 1) ++cnt; else if(t == 2) --cnt;if(cnt == 1){Insert(now + (1 << bit[u]) - 2 * (1 << bit[j - 1]) - 2 * (1 << bit[j]), nval);break;}}}else if(dw == 1 && ri == 2) Insert(now - ri * (1 << bit[j - 1]) - dw * (1 << bit[j]), nval);else if(dw == 2 && ri == 1 && i == ex && j == ey) ans += nval;}}}
}int main(){
#ifndef ONLINE_JUDGEfreopen("test.in", "r", stdin);freopen("test.out", "w", stdout);
#endifscanf("%d%d", &n, &m);For(i, 1, n){scanf("%s", rs + 1);For(j, 1, m)if(rs[j] == '.') mp[i][j] = 1, ex = i, ey = j;}PlugDp();printf("%lld\n", ans);return 0;
}

这篇关于[Ural1519] Formula 1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/614811

相关文章

HDU2139 Calculate the formula【水题】

Calculate the formula Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7441    Accepted Submission(s): 2284 Problem Descriptio

Mathematica 怎么列表展示出复合函数高阶导数公式 Faà di Bruno's formula 关于Mathematica推公式的一些技巧等

来自于群友的问题again 如图: 很明显用D就可以解决,但是还要让麦酱认出r和t是复合函数,所以要带上自变量,对于t来说自变量是s,自然写成t[s],而r是复合函数,直接套着写就行了~ D[r[t[s]],{s,#}]&/@Range@4 代码就写完了,但是输出不符合阅读习惯,看着很头疼啊,比较一下,还是t[s]的问题,写成t就舒服多了 已经可以读了嗯,但是不要忘了麦酱的排版能力,

Sherman-Morrison-Woodbury formula 证明

文章目录 1. 公式2. 证明 1. 公式 M = I − u v T ⇒ M − 1 = I + u v T 1 − v T u (1) M=I-uv^T\Rightarrow M^{-1}=I+\frac{uv^T}{1-v^Tu}\tag{1} M=I−uvT⇒M−1=I+1−vTuuvT​(1) 2. 证明 定义矩阵E表示如下: E = [ I u v T 1 ]

数学小报4 - 三次方程的求根公式 Quadratic Formula

数学小报4 - 三次方程的求根公式 Quadratic Formula 0. 前言 完整内容同步发表于 https://blog.csdn.net/Mr_Azz/article/details/135443217 由于证明量过于巨大,部分证明简化,详情请见网址。 1. 思考 我们学习过一元二次方程的求根公式 x = − b ± b 2 − 4 a c 2 a x=\frac{-b \p

wps使用Latex编辑公式没有Latex formula

wps使用Latex编辑公式没有Latex formula 1. 下载CTEX2. 下载LaTeXEE3. 配置Miktex4. 配置latexee5. 用管理员权限运行latexeqedit.exe6. wps插入latex公式 1. 下载CTEX 下载CTEX网址,我下载的下图这个,下载完了之后运行exe文件安装ctex。 2. 下载LaTeXEE 下载LaTeXEE网

综合使用JavaScript、LotusScript Agent和Formula的技巧

一 概述 在使用 Designer开发B/S模式的应用时,JavaScript、LotusScript和Formula是我们主要用到的三种开发语言。它们在各自的位置都有着很强劲的优势。 1. JavaScript因为只能取得浏览器端的数据,不能访问Notes DOM;所以,主要用在浏览器端的数据验证、信息提示等对当前Brows窗口操作易的用性功能。 2. LotusScript能访问Notes

插头DP讲解+[BZOJ1814]:Ural 1519 Formula 1(插头DP)

1.什么是插头$DP$? 插头$DP$是$CDQ$大佬在$2008$年的论文中提出的,是基于状压$D$P的一种更高级的$DP$多用于处理联通问题(路径问题,简单回路问题,多回路问题,广义回路问题,生成树问题)。 插头$DP$每道题都不一样,且需要进行较为繁琐的分类讨论,所以插头$DP$十分锻炼思维的严谨性和全面性。 2.插头$DP$思路  $\mathcal{A.}$状态确立   $\alph

浙江财经大学第14届校赛 F Formula One (思维)

【题意】  给N个车, 时间P   半径R,   n个汽车 完成一圈的信息,  求从0-P   发生超车的次数; 【无敌LK算法】     扫描n汽车, 对于 两辆汽车 求 第一次相遇的时间  时间为   (t1*t2) /(t1-t2)      故 在p 内相遇的次数为 P*(t1-t2) / (t1*t2)     当 恰p结束 两辆车相遇 不算超车 减一 嗯,应该是

埃克森美孚和保时捷拓展赛车运动技术合作,进军Formula E电动方程式

美孚品牌润滑油液将被用于保时捷Formula E赛车   德州斯普林--(美国商业资讯)--埃克森美孚(ExxonMobil)将拓展其与保时捷(Porsche)的全球业务与技术合作伙伴关系,在2019 / 2020赛季与这家德国豪华汽车制造商就Formula E电动方程式系列赛车开展合作。此次新合作是埃克森美孚首次进军电动赛车运动领域。     从今年底在沙特阿拉伯的首站比赛开始,埃克森美孚将向保

终端报Error: No available formula with the name php70解决

问题描述:每次打开iTerm时都会报Error: No available formula with the name "php70"的错误 今天检查了一下我的~/.zshrc的文件目录,发现我之前安装php时添加的系统路径命令还在 export PATH="$(brew --prefix php70)/bin:$PATH"export PATH="$(brew --prefix php70