日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GarsiaWachs算法

發布時間:2023/12/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GarsiaWachs算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于一列的石子歸并問題,除了樸素的O(n^3)的dp做法及其O(n^2)優化,還有GarsiaWachs算法。

算法流程是,找一個最小的k,使得a[k-1]<=a[k+1],將a[k-1]和a[k]合并;從當前位置向前找到一個最大的i,使得a[i]>a[k-1]+a[k],并將新合并的一堆移到i的后面;重復操作n-1次,直至只剩下1堆,答案就是每次合并結果累加起來。

1 #include <cstdio> 2 3 const int maxn = 105, inf = 0x3f3f3f3f; 4 5 struct Node { 6 int num, pre, next; 7 } a[maxn]; 8 9 inline void del(int x) { 10 int pp = a[a[x].pre].pre, nn = a[x].next; 11 a[pp].next = nn, a[nn].pre = pp; 12 } 13 14 inline void insert(int x, int y) { 15 a[x].pre = y, a[x].next = a[y].next; 16 a[a[y].next].pre = x, a[y].next = x; 17 } 18 19 int main() { 20 int n, ans = 0; 21 scanf("%d", &n); 22 a[0].num = a[n + 1].num = inf; 23 a[0].next = 1, a[n + 1].pre = n; 24 for (int i = 1; i <= n; ++i) { 25 scanf("%d", &a[i].num); 26 a[i].pre = i - 1, a[i].next = i + 1; 27 } 28 for (int t = 1; t <= n - 1; ++t) { 29 int x, y, sum; 30 for (int i = a[0].next; ; i = a[i].next) 31 if (a[a[i].pre].num <= a[a[i].next].num) { 32 x = i; 33 break; 34 } 35 sum = a[a[x].pre].num + a[x].num; 36 for (int i = a[a[x].pre].pre; ; i = a[i].pre) 37 if (a[i].num > sum) { 38 y = i; 39 break; 40 } 41 del(x); 42 a[x].num = sum; 43 printf("%d ttt\n", sum); 44 insert(x, y); 45 ans += sum; 46 } 47 printf("%d", ans); 48 return 0; 49 } Code Example

?

轉載于:https://www.cnblogs.com/Mr94Kevin/p/10926709.html

總結

以上是生活随笔為你收集整理的GarsiaWachs算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。