[哈夫曼树] Jzoj P4210 我才不是萝莉控呢
生活随笔
收集整理的這篇文章主要介紹了
[哈夫曼树] Jzoj P4210 我才不是萝莉控呢
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
小Y:“小R 你是蘿莉控嗎。”小R:“...”為了避免這個尷尬的話題,小R 決定給小Y 做一道題。
有一個長度為n 的正整數數組A,滿足Ai >= Ai+1,現在構造一個數組B,令Bi =。
現在,有一個n * n 的網格圖,左下角坐標是(1, 1),右上角坐標是(n, n)。有一個小SB正在坐標為(n, 1) 的位置,每一時刻,如果他現在在(x, y),他可以選擇走到(x ?-1,y + 1) 或者(x, (y + 1) div 2),如果選擇后者,他要支付Bx的代價。
現在他想走到(1, 1),你可以告訴他他支付的代價最少是多少嗎?注意在任何時候他都不能離開這個網格圖。
Input
第一行輸入一個正整數T 表示數據組數。對于每組數據,第一行是一個整數n,接下來一行n 個整數表示數組A。
Output
對于每組數據,輸出一個整數表示答案。Sample Input
13
1 1 1
Sample Output
5樣例解釋:
選擇的路徑可以是:(3, 1)->(2, 2)->(2, 1)->(1, 2)->(1, 1)
Data Constraint
對于30% 的數據,n <= 10對于50% 的數據,n <=1000
對于100% 的數據,n<= 10^5,1 <= T<= 10,1 <= Ai<= 10^4
?
題解
- 題目大意:當前有個小SB在(n,1)然后他要走到(1,1),他可以選擇兩種走法,一種是走到(x+1,y-1)不需要代價,一種是走到(x,(y+1)/2)需要代價,問他需要的最小代價是多少
- 這種題一眼看到一般就是dp或這是最短路徑問題
- 50%:顯然可以用dp來做,設f[i][j]為走到(i,j)的最小代價
- 那么就有兩種轉移情況,不過這dp要倒著做,不然可以考慮跑多幾次
- 100%:數組是有序的,所以在哈夫曼樹上深度是遞增不減
- 那么我們可以設f[i][j]為現在放入了下標比 i 小的所有節點,剩余的葉子節點有 j 個
- 按照題目我們就有兩種情況可以走
- ①F[i+1][j?1],表示在剩下可放的節點中選一個來放第(i+1)個,不需要代價
- ②F[i][j?2]+Σa[i+1][n],表示把剩下的j個葉子節點往下再擴展2個節點,需要為代價就是后綴和
- 其實就是50分的dp逆做,然后答案就是哈夫曼樹的最小權值
- (其實這題就是合并果子,合并果子也是哈夫曼樹求最小權值)
- 直接用優先隊列做就好了
代碼
1 #include <iostream> 2 #include <queue> 3 #include <cstdio> 4 using namespace std; 5 int T,n; 6 long long ans; 7 priority_queue<int,vector<int>,greater<int> >Q; 8 int main() 9 { 10 scanf("%d",&T); 11 while (T--) 12 { 13 scanf("%d",&n),ans=0; 14 for (int i=1,x;i<=n;i++) scanf("%d",&x),Q.push(x); 15 for (int i=n,x;i>1;i--) x=Q.top(),Q.pop(),x+=Q.top(),Q.pop(),ans+=x,Q.push(x); 16 printf("%lld\n",ans); 17 while (!Q.empty()) Q.pop(); 18 } 19 }?
轉載于:https://www.cnblogs.com/Comfortable/p/10299402.html
總結
以上是生活随笔為你收集整理的[哈夫曼树] Jzoj P4210 我才不是萝莉控呢的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回文串 --- 动态dp UVA 11
- 下一篇: PKUWC2019游记