參考部落格洛谷 p3713
有一張 \(n \times m\) 的網格圖,每個格仔上有乙個字元,乙個格仔是八聯通的,定義一條路徑
選定起點 \(s\) ,終點 \(t\) ,\(s \not= t\)
設一步後從 \((x, y)\) 走到了 \((x', y')\) 那麼 \(|tx - x| \ge |tx - x'|, |ty - y| \ge |ty - y'|\)
將經過格仔上的字元連成乙個字串,則這條路徑的種類可以被表示為這個字串
問每種路徑的個數的平方之和
\(1 \le n,m \le 30\)
1000ms, 128mb
乙個人出發每種類的方案平方和,從組合意義上可以轉化為兩個人出發走相同路徑的方案數。。。。
容斥計算答案,通過一些剪枝減少dp次數
#include #include #include using namespace std;
templatevoid read(t &x)
while(ch>='0'&&ch<='9')
x *= f;
}#define judge(x, y) ((x) > 0 && (x) <= n && (y) > 0 && (y) <= m)
#define rev(x) ((x) < 4 ? 3 - (x) : 11 - (x))
const int mod = 1000000009;
const int maxn = 30 + 5;
const int maxm = 30 + 5;
int n, m; char s[maxn][maxm];
int n1, n2, d1[8][2], d2[8][2];
bool vis[maxn][maxm][maxn][maxm];
int f[maxn][maxm][maxn][maxm], g[8][8];
inline void add(int &x, int y)
void process(int d[8][2], int &n, int k) , , },
, , },
, , },
, , },
}, }, }, }};
n = k < 4 ? 3 : 1;
memcpy(d, t[k], sizeof(t[k]));
}int dp(int a, int b, int c, int d)
} return re;
}int solve(int x, int y)
}} }
g[y][x] = g[rev(x)][rev(y)] = g[rev(y)][rev(x)] = re;
return re;
} int main()
int an = 0;
memset(g, -1, sizeof(g));
for(int i = 0; i < 8; ++i)
} printf("%d\n", an);
return 0;
}
對平方和的轉化。。。
從組合意義上思考題目
P3713 BJOI2017 機動訓練
這個題簡直神仙,求相同路徑的平方就等於兩個人走相同路徑的方案數。然後。暴力搜尋 記憶化就行了,比較玄學。題幹 題目描述 整個島可以看作一片 n m 的區域,每個格仔有自己的地形。一條路徑由一系列八連通的格仔組成,兩個格仔八連通當且僅當這兩個格仔擁有公共的 頂點。定義一條 機動路徑 如下 1 它是一條...
洛谷P5323 BJOI2019 光線
題目大意 有 n 層玻璃,每層玻璃會讓 a 的光通過,並把 b 的光反射。有一束光從左向右射過,問多少的光可以透過這 n 層玻璃 題解 事實上會發現,可以把連續的幾層玻璃合成一層玻璃,但是要注意玻璃兩側的反射率可能是不一樣的。令 a 為前 i 層玻璃的透過率,b 為前 i 層玻璃從右向左的反射率。a...
洛谷P3761 TJOI2017 城市
從加里敦大學城市規劃專業畢業的小明來到了乙個地區城市規劃局工作。這個地區一共有ri座城市,1條高速公路,保證了任意兩運城市之間都可以通過高速公路相互可達,但是通過一條高速公路需要收取一定的交通費用。小明對這個地區深入研究後,覺得這個地區的交通費用太貴。小明想徹底改造這個地區,但是由於上司給他的資源有...