发现题目中 McdRRR 每出现一个 R 都会增加 2 的指数次 cd 也就是下面的 judge 函数的内容; 看题解区说可能会有 MR 嵌套的可能,求一组 hack 数据
#include <bits/stdc++.h>
using namespace std;
const int N = 100 + 5;
int n, m, k, _;
// int a[N];
int dp[N][N];
char ch[N];
int judge(int l, int mid, int r)
{
int up = mid, p = l, bit = 0; // up 为上限, bit 需要多少个 R
int delta = mid - l + 1, i = 0;
for(i = mid + 1; i <= r; i ++){
if(ch[i] == ch[p]) p ++;
else break;
if(p == up + 1){
p = l;
up = up + delta;
delta *= 2;
bit ++;
}
}
int ans = mid - l + 1 + bit;
if(p != l){
ans += p - l;
}
if(i != r + 1) ans += r + 1 - i;
if(l != 1 && bit) ans ++;
return ans;
}
signed main()
{
// IOS;
while(~ scanf("%s", ch + 1)){
n = strlen(ch + 1);
for(int i = 1; i <= n; i ++) dp[i][i] = 1;
for(int len = 2; len <= n; len ++){
for(int i = 1; i <= n; i ++){
int j = i + len - 1;
if(j > n) break;
dp[i][j] = len;
for(int k = i; k < j; k ++){
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
int bit = judge(i, k, j);
dp[i][j] = min(dp[i][j], bit);
}
}
}
printf("%d\n", dp[1][n]);
}
// PAUSE;
return 0;
}