最优子结构状态方程:
完整代码及注释:
#include<iostream>
using namespace std;
const int NN = 100;
int p[NN], l[NN], b[NN], s[NN];
// 计算一个整数的二进制表示的长度
int length(int i)
{
int k = 1;
i = i / 2;
while (i > 0)
{
k++;
i /= 2;
}
return k;
}
// 计算每个图像块的最小压缩代价
void Compress(int n, int p[], int s[], int l[], int b[])
{
int Lmax = 256, header = 11; // 最大图像块长度和压缩头部长度
s[0] = 0; // 初始化 s[0] 为 0
for (int i = 1; i <= n; i++)
{
b[i] = length(p[i]); // 计算当前像素值的二进制表示长度
int bmax = b[i]; // 初始化当前考虑的最大二进制表示长度
s[i] = s[i - 1] + bmax; // 初始化当前图像块的压缩代价
l[i] = 1; // 初始化当前图像块的长度为 1
for (int j = 2; j <= i && j <= Lmax; j++) // 循环遍历可能的图像块长度
{
if (bmax < b[i - j + 1]) bmax = b[i - j + 1]; // 更新当前考虑的最大二进制表示长度
if (s[i] > s[i - j] + j * bmax) // 比较当前图像块的压缩代价和使用长度为 j 的图像块时的压缩代价
{
s[i] = s[i - j] + j * bmax; // 如果使用长度为 j 的图像块能够减小压缩代价,则更新当前图像块的压缩代价
l[i] = j; // 同时更新当前图像块的长度为 j
}
}
s[i] += header; // 将压缩头部长度加到每个图像块的压缩代价中
}
}
int main()
{
int n;
cout << "请输入图像块的数量:";
cin >> n; // 读取图像块的数量
for (int i = 1; i <= n; i++)
{
cout << "请输入第" << i << "个图像块的像素值:";
cin >> p[i]; // 读取每个图像块的像素值
}
Compress(n, p, s, l, b); // 计算最小压缩代价
cout << "最小压缩代价为:" << s[n] << endl; // 输出结果
return 0;
}