CCF CSP 201612 4壓縮編碼解題報告

2021-07-26 07:30:54 字數 1765 閱讀 8794

標籤(空格分隔): ccf-csp

傳送門題目描述:在乙個操場上擺放著一行共n堆的石子。現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請計算出將n堆石子合併成一堆的最小得分。

題解:人們的第一想法往往是貪心(找最大/最小的堆合併),但是很容易找到貪心的反例:

顯然利用貪心來做是錯誤的,貪心演算法在子過程中得出的解只是區域性最優,而不能保證使得全域性的值最優。

如果n-1次合併的全域性最優解包含了每一次合併的子問題的最優解,那麼經這樣的n-1次合併後的得分總和必然是最優的。因此我們需要通過動態規劃演算法來求出最優解。

在此我們假設有n堆石子,一字排開,合併相鄰兩堆的石子,每合併兩堆石子得到乙個分數,最終合併後總分數最少的。

我們設dp[i][j]定義為第i堆石子到第j堆石子合併後的最少總分數,sum[i][j]為第i堆到第j堆石子的總數,a[i]為第i堆石子得石子數量。

當合併的石子堆為1堆時,很明顯dp[i][i]的分數為0;

當合併的石子堆為2堆時,dp[i][i+1]的分數為a(i)+a(i+1);

當合併的石子堆為3堆時,dp[i][i+2]的分數為min((dp[i][i]+dp[i+1][i+2]+sum[i][i+2]),(dp[i][i+1]+dp[i+2][i+2]+sum[i][i+2]));

當合併的石子堆為4堆時……

可總結出動態轉移方程:dp[i][j] = min (i <= k < j)

問題分析:首先要清楚huffman編碼的原理,然後要在huffman的基礎上保證有序,所以合併過程從huffman的合併最小的兩個變成了合併相鄰兩個讓其總和最小,轉化成石子合併問題,每堆石子的數量相當於字母出現的頻率。

時間複雜度:o(n^3),理論上可以得60分 (實際上,如果ccf的資料比較弱的話可以得滿分,親測2.437s過)。

時間優化:四邊形優化

詳細證明:傳送門

設m[i,j]表示動態規劃的狀態量。

m[i,j]有類似如下的狀態轉移方程:

m[i,j]=min(i≤k≤j)

m滿足四邊形不等式是適用這種優化方法的必要條件

定義s(i,j)為函式m(i,j)對應的使得m(i,j)取得最大值的k值。

我們可以證明,s[i,j-1]≤s[i,j]≤s[i+1,j]

那麼改變狀態轉移方程為:

m[i,j]=min (s[i,j-1]≤k≤s[i+1,j])

時間複雜度:o(n^2),可以得100分(親測46ms過)。

#include 

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn=1007;

const ll oo=(1ll<<60);

int n,s[maxn][maxn];

ll a[maxn],dp[maxn][maxn],sum[maxn];

int main()

for(len=1;lenfor(i=1;i+len<=n;i++)

}dp[i][j]=tmp;

s[i][j]=mink;}}

printf("%lld\n",dp[1][n]);

return

0;}

音訊壓縮編碼

只有當信源產生的訊號具有冗餘時,才能對其進行壓縮。下面介紹幾種音訊冗餘的概念 1 時域冗餘度 幅度的非均勻分布 統計表明,語音中的小幅度樣本比大幅度樣本出現的概率要高。週期之間的相關 在特定的瞬間,某一聲音往往只是有頻帶內少數頻率成分起作用。當聲音中只存在少數幾個頻率時,就會象波一樣,在週期與週期之...

RLE 壓縮編碼

rle全程run length encoding,翻譯為遊程編碼,又譯行程長度編碼,又稱變動長度編碼法 run coding 在控制論中對於二值影象而言是一種編碼方法,對連續的黑 白畫素數 遊程 以不同的碼字進行編碼。遊程編碼是一種簡單的非破壞性資料壓縮法,其好處是加壓縮和解壓縮都非常快。其方法是計...

單詞的壓縮編碼

1 描述820 給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 time me bell 我們就可以將其表示為 s time bell 和 indexes 0,2,5 對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 結束,來恢...