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 25
int 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 1001
int 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;
}