码迷,mamicode.com
首页 > 其他好文 > 详细

[SCOI2007]压缩

时间:2020-03-04 14:28:54      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:图片   压缩   soft   位置   最小   open   its   hide   isp   

区间dp

设f[i][j][0/1]表示i~j这一段中无/可能有 M 的最小长度

讨论是否整段折叠,以即插入M的位置可以得到转移方程

f[i][j][0] = min(f[i][k][0] + j - k)

f[i][j][1] = min(min(f[i][k][0/1]) + min(f[k + 1][j][0/1] + 1))

if i~mid == mid + 1~j  f[i][j][0] = min(f[i][mid][0] + 1)

技术图片
#include<bits/stdc++.h>
using namespace std;

char s[105];
int f[105][105][2], n;

bool check(int l, int r) {
    int mid = (l + r)/2, len = r - l + 1;
    if(len%2 != 0) return 0;
    for(int p = l; p <= mid; p++)
        if(s[p] != s[p + len/2]) return 0;
    return 1;
}

int main() {
    cin>>(s + 1);
    n = strlen(s + 1);
    for(int L = 1; L <= n; L++) {
        for(int i = 1; i + L - 1 <= n; i++) {
            int j = i + L - 1;
            f[i][j][0] = f[i][j][1] = L;
            for(int k = i; k < j; k++)
                f[i][j][0] = min(f[i][j][0], f[i][k][0] + j - k);
            for(int k = i; k < j; k++)
                f[i][j][1] = min(f[i][j][1], min(f[i][k][1], f[i][k][0]) + min(f[k + 1][j][0], f[k + 1][j][1]) + 1);
            if(check(i, j)) f[i][j][0] = min(f[i][j][0], f[i][i + L/2 - 1][0] + 1);
        }
    }
    cout<<min(f[1][n][0], f[1][n][1])<<endl;
    return 0;
}
View Code

[SCOI2007]压缩

标签:图片   压缩   soft   位置   最小   open   its   hide   isp   

原文地址:https://www.cnblogs.com/ympc2005/p/12409168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!