这题我在USACO上过了,结果在洛谷上2WA 8TLE,有大佬能解答一下为什么吗?复杂度没有问题,而且常数也不大。代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i, m, n) for(int i = m; i <= n; i++)
//快读快写
template<class Ty>
inline void read(Ty & X) {
X = 0; Ty flag = 1; char ch = getchar();
while(ch < '0' || ch > '9') { if (ch == '-') flag = 0; ch = getchar(); }
while(ch >= '0' && ch <= '9') { X = (X << 1) + (X << 3) + ch - '0'; ch = getchar(); }
if (!flag) X = ~(X - 1);
}
template<class Ty>
inline void write(Ty X) {
if (X < 0) { X = ~(X - 1); putchar('-'); }
if (X > 9) write(X / 10);
putchar(X % 10 + '0');
}
const int maxn = 1e5 + 5;
int d[maxn][25][3], N, K;
char ch[maxn]; //0 -> Hoof, 1 -> Paper, 2 -> Scissors -> 0x2, 2x1, 1x0
//记忆化搜索
inline int dp(int i, int remain, int cur) {
if (i == N + 1) return 0;
if (d[i][remain][cur]) return d[i][remain][cur];
int flag = 0;
if (cur == 0 && ch[i] == 'S') flag = 1;
if (cur == 1 && ch[i] == 'H') flag = 1;
if (cur == 2 && ch[i] == 'P') flag = 1;
int ans1 = dp(i + 1, remain, cur);
if (!remain) return d[i][remain][cur] = ans1 + flag;
int ans2 = dp(i + 1, remain - 1, (cur + 1) % 3);
int ans3 = dp(i + 1, remain - 1, (cur + 2) % 3);
return d[i][remain][cur] = max(max(ans1, ans2), ans3) + flag;
}
int main() {
ios::sync_with_stdio(false);
// freopen("hps.in", "r", stdin);
// freopen("hps.out", "w", stdout);
read(N), read(K);
rep(i, 1, N) cin >> ch[i];
write(max(dp(1, K, 2), max(dp(1, K, 0), dp(1, K, 1)))), puts("");
return 0;
}