2017-09-25校训练题题解

来源:互联网 发布:互联网医院 知乎 编辑:程序博客网 时间:2024/06/05 05:18

t1 傻逼dfs(然而直接状压会T)。

#include<set>#include<queue>#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>using namespace std;inline int read() {int x = 0, flag = 1; char ch = getchar();while (ch > '9' || ch < '0') { if (ch == '-') flag = -1; ch = getchar(); }while (ch <= '9' && ch >= '0') { x = x * 10 + ch - '0'; ch = getchar(); }return x * flag;}#define rep(ii, aa, bb) for (int ii = aa; ii <=  bb; ii++)#define ll long long#define N 25int n;int p;ll a[N];ll ans = 0;ll dfs(int pos, ll cnt) {if (pos > n) return cnt % p;return max(dfs(pos + 1, cnt), dfs(pos + 1, cnt ^ a[pos]));}int main() {cin >> n >> p;rep(i, 1, n) cin >> a[i];cout << dfs(1, 0);return 0;}


t2 长得像数位dp,但还不会,留坑。


t3 dp。将原串分为两段, (n - 2 * 两个串的最长lcs)就是答案。

#include<set>#include<queue>#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>using namespace std;inline int read() {int x = 0, flag = 1; char ch = getchar();while (ch > '9' || ch < '0') { if (ch == '-') flag = -1; ch = getchar(); }while (ch <= '9' && ch >= '0') { x = x * 10 + ch - '0'; ch = getchar(); }return x * flag;}#define rep(ii, aa, bb) for (int ii = aa; ii <=  bb; ii++)#define ll long long#define N 1001int n;char s[N];int f[N][N];int dp(int l1, int r1, int l2, int r2) {memset(f, 0, sizeof(f));rep(i, l1, r1) rep(j, l2, r2) {int p1 = i == l1 ? 0 : i - 1;int p2 = j == l2 ? 0 : j - 1;if (s[i] == s[j]) f[i][j] = f[p1][p2] + 1;else f[i][j] = max(f[i][p2], f[p1][j]);}return f[r1][r2];}int main() {cin >> n;cin >> s + 1;int ans = 0;rep(i, 1, n - 1) ans = max(ans, dp(1, i, i + 1, n));cout << n - 2 * ans;return 0;}


原创粉丝点击