图像压缩问题(动态规划)

#include <iostream>
#include <cmath>
#include <stack>
#define N 6//像素个数
using namespace std;
int S[N + 1];//存储结果 
int T[N + 1];//用于追踪解
int b[N + 1][N + 1];//记录该两个下标所围区间内最大像素
void Compress(int *P, int n){
    int i, j, temp0, temp1;
    for (i = 1; i <= n; ++i) {
        b[i][i] = P[i - 1];
        temp0 = (i < 256) ? i : 256;
        S[i] = S[i - 1] + floor(log2(b[i][i]) + 1) + 11;
        T[i] = 1;
        for (j = 2; j <= temp0; ++j) {
            b[i -j + 1][i] = (b[i][i] > b[i -j + 1][i - 1]) ? b[i][i] : b[i -j + 1][i - 1];
            temp1 = S[i - j] + j * floor(log2(b[i -j + 1][i]) + 1) + 11;
            if (S[i] > temp1) {
                S[i] = temp1;
                T[i] = j;
            }
        }
    }
}
void Track(int n, stack<int> *s){
    if (n <= 0) return;
    int temp = T[n];
    s -> push(temp);
    Track(n -= temp, s);
}
int main(){
    int P[N] = {10, 12, 15, 255, 1, 2};//所要压缩的像素序列值
    Compress(P, N);
    cout<<"最优存储位数为:"<<S[N]<<endl;
    stack<int> s;
    Track(N, &s);
    cout<<"分段长度分别为:";
    while (!s.empty()) {
        cout<<s.top()<<" ";
        s.pop();
    }
    cout<<endl;
    return 0;
}

原理参见 屈婉玲老师 算法设计与分析 ORZ

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容