AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

图像压缩问题

作者: 作者的头像   菠萝2084 ,  2024-10-31 09:25:01 ,  所有人可见 ,  阅读 29


3


1

图像压缩问题

数据结构

DP数组

算法

动态规划求解

屏幕截图 2024-10-31 091738.png

符号说明:

bm[i][j]: 表示从[i,j]区间内图像像素所需的最大表示位数
s[i]: [1,i]区间像素压缩之后的最小比特值
p[i]: 存储像素序号位i的所需的最小比特数
l[i]:存储当前像素需要之前的同一像素段的长度(包括i本身)
b[i]: 当前像素所处像素段的最小比特数

代码

#include<iostream>
#include<cmath>

using namespace std;    
const int N=110,M=11;   // 每个像素段需要使用额外的11bit存储段信息
int s[N],l[N],b[N],p[N];
int bm[N][N];   // bp[i,j] -> [i - j] 像素点编码长度最大值
int n;

int main(){
    cin >> n;
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        p[i] = bm[i][i] = ceil(log2(x+1));  // 像素需要从1开始
    }
    // 初始化bm数组 (上三角部分有效)
    for(int l = 1;l <= n-1;l ++){
        for(int i = 1;i + l <= n;i ++){
            bm[i][i + l] = max(bm[i][i+l-1],p[i + l]);
        }        
    }
    // 更新s数组并维护
    for(int i=1;i<=n;i++){
        b[i] = p[i];
        l[i] = 1;   // 初始化新段的信息header =11;
        s[i]=s[i-1]+bm[i][i];
        for(int k=2 ; k<=i & k < 256;k ++){
            if(s[i] > s[i - k] + k * bm[i-k+1][i]){
                l[i] = k;
                b[i]=bm[i-k+1][i];
                s[i]=s[i - k] + k * bm[i-k+1][i];
            }
        }
        s[i]+=11;    // 3bit段像素长度和8bit长度信息
    }

    cout<<s[n]<<endl;
    // for(int i=1;i<=n;i++){
    //     cout<<l[i]<<" ";
    // }
    // cout<<endl;
    // for(int i=1;i<=n;i++){
    //     cout<<b[i]<<" ";
    // }
    // cout<<endl;
    int i=n;
    while(i > 0){
        cout << "("<<l[i]<<","<<b[i]<<")"<<" ";
        i -= l[i];
    }
    cout<<endl;
    return 0;
}

输入数据(复制用)

16
10 9 12 40 50 35 15 12 8 10 9 15 11 130 160 240

测试样例

屏幕截图 2024-10-31 092436.png

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息