前言
(施工中)
博主按照正常省選時間嘗試了九省聯考,總體而言呢,算中規中矩。Day1裏送的分比較足,T1一眼題,T2是一道不錯的思維題,T3好像沒能把暴力選手與正解選手區分開?Day2裏博主衝着A題去的,口胡了T1和T3的題解,無奈數據結構忘了個乾淨無法完全解決,T2貌似是神仙DP優化題,聽講全場最高60pts,博主調了1h纔拿到60,loj在題目後面說是“簡單題”,加上讀錯題坑了博主2h。這些值得反思。
總體而言,狀態優秀的話300+不是難題。
Day 1
一雙木棋
記錄輪廓線,然後隨便dp。(好像map會被卡,umap就不會啦)
#include <bits/stdc++.h>
#include <tr1/unordered_map>
#define rep(i, a, b) for (int i = a, i##end = b; i <= i##end; ++i)
#define per(i, a, b) for (int i = a, i##end = b; i >= i##end; --i)
#define rep0(i, a) for (int i = 0, i##end = a; i < i##end; ++i)
#define per0(i, a) for (int i = a-1; ~i; --i)
#define chkmin(a, b) a = std::min(a, b)
#define chkmax(a, b) a = std::max(a, b)
#define x first
#define y second
typedef long long ll;
const int inf = 1<<30;
inline int read() {
int w = 0, f = 1; char c;
while (!isdigit(c = getchar())) c == '-' && (f = -1);
while (isdigit(c)) w = w*10+(c^48), c = getchar();
return w * f;
}
int n, m, A[2][10][10];
std::tr1::unordered_map<ll, int> f;
ll calc(std::vector<int> S) {
ll res = 0;
rep0(i, S.size()) res = res*m+S[i];
return res;
}
int dfs(std::vector<int> S, int cur) {
ll keyS = calc(S);
if (f.count(keyS)) return f[keyS];
f[keyS] = -inf;
rep0(i, n) {
if (S[i] < m && (!i || S[i] != S[i-1])) {
std::vector<int> _S = S; _S[i]++;
dfs(_S, cur^1);
chkmax(f[keyS], A[cur][i][S[i]] - f[calc(_S)]);
}
}
return f[keyS] == -inf ? f[keyS] = 0 : f[keyS];
}
int main() {
n = read(), m = read();
rep0(cur, 2)
rep0(i, n)
rep0(j, m)
A[cur][i][j] = read();
std::vector<int> st; st.resize(n, 0);
printf("%d", dfs(st, 0));
return 0;
}