BJOI2017 機動訓練

2022-04-29 05:54:08 字數 1088 閱讀 5382

落谷、loj。

定義機動路徑為:

相同地形序列指路徑上順序經過的地形序列。

定義機動路徑的權值為相同地形序列的數量之和。

求所有機動路徑的權值之和。

同一類機動路徑,他的貢獻就是數量的平方 \(\leftrightarrow\) 答案即本質不同機動路徑數量的平方和 \(\leftrightarrow\) 即兩個人走的機動路徑形式相同的方案總和。

由於 從起點開始每一步都向不遠離終點的方向移動 這一性質,所以只要我們確定了他移動的 \(x, y\) 方向,那麼就可以 \(dp\) 了,因為具有了無後效性。那就列舉一下兩個人走的方向。

對於乙個人來說,分為左上、左下、右上、右下(一型別)、正上方、正下方、正右方、正左方(二型別)四種狀態。

發現一型別包含二型別,所以要簡單的容斥一下:

然後當前的 \(f_\) 表示第乙個人在 \((a, b)\) ,第二個人在 \((c, d)\)。從起點走到這兩個地方的方案數。

把能走的方式處理一下,然後寫記搜就行。

\(o(64n^2m^2)\)

此題卡常,可以利用 \(work(a, b, c, d) = work(c, d, a, b)\) 的對稱性來減小 \(2\) 倍常數

#include #include #include #define rint register int

using namespace std;

const int n = 31, p = 1e9 + 9;

int n, m, ans, dx[2][3], dy[2][3], cnt[2], f[n][n][n][n], w[3][3][3][3];

char g[n][n];

int inline dp(int a, int b, int c, int d)

void prework(int o, int x, int y) }}

int inline work(int a, int b, int c, int d)

int main()

}} }

printf("%d\n", ans);

return 0;

}

BJOI2017 魔法咒語

矩陣乘法 ac 自動機 是道很不錯的題了 首先是前六十分,就是乙個 ac 自動機上的套路 dp 設 dp i j 表示匹配出的長度為 i 在自動機上位置為 j 的方案數,轉移的話就列舉下乙個單詞選擇哪個放到自動機上一波匹配就好了 後面 40 分強行變成了另外一道題,l 變成了 1e8 一看就是矩乘的...

BJOI2017 魔法咒語

題目鏈結 給 n 個基本詞彙,m 個禁忌詞語。求用基本詞彙 每個詞彙可重複詞彙 拼成長度為 l 的 不包含任何禁忌詞語的字串的方案數。在 資料規模與約定 中,我們發現可以把資料劃分成兩檔 l le 100 的 前 60pts 基本長度不超過 2 的 顯然不包含這個東西判定可以用 ac 自動機,用 m...

P3713 BJOI2017 機動訓練

這個題簡直神仙,求相同路徑的平方就等於兩個人走相同路徑的方案數。然後。暴力搜尋 記憶化就行了,比較玄學。題幹 題目描述 整個島可以看作一片 n m 的區域,每個格仔有自己的地形。一條路徑由一系列八連通的格仔組成,兩個格仔八連通當且僅當這兩個格仔擁有公共的 頂點。定義一條 機動路徑 如下 1 它是一條...