60分求助,区间dp,求给一组样例
查看原帖
60分求助,区间dp,求给一组样例
311494
穷源溯流楼主2021/10/13 16:30

发现题目中 McdRRRMcdRRR 每出现一个 RR 都会增加 22 的指数次 cdcd 也就是下面的 judgejudge 函数的内容; 看题解区说可能会有 MRMR 嵌套的可能,求一组 hackhack 数据

#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;
}
2021/10/13 16:30
加载中...