什么鬼???
查看原帖
什么鬼???
306962
MVP_Harry楼主2020/9/7 07:34

这题我在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; 
}
2020/9/7 07:34
加载中...