日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

平行四边形优化

發布時間:2023/11/27 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 平行四边形优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?

平行四邊形優化(HDOJ3506)

?1034人閱讀?評論(0)?收藏?舉報 ?分類:

四邊形不等式是一種比較常見的優化動態規劃的方法:

證明:http://baike.baidu.com/view/1985058.htm?fr=aladdin

解決這類問題的大概步驟是:

狀態轉移方程 dp[i][j]=min{dp[i][k-1]+dp[k][j]}+w[i][j] ?(i<=k<=j)?

要用平行四邊形優化則要證明w[i][j],dp[i][j]是否滿足四邊形不等式


w[a,c]+w[b,d]<=w[b,c]+w[a,d](a<b<c<d) 就稱其滿足凸四邊形不等式

或打表觀察w[i][j+1]-w[i][j]關于i的表達式,如果關于i遞減,則w滿足凸四邊形不等式

如果一個函數w[i][j],滿足?w[i'][j]<=w[i][j'] ?i<=i'<=j<=j'?則稱w關于區間包含關系單調

如果w同時滿足四邊形不等式和區間單調關系,則dp也滿足四邊形不等式


通常的動態規劃的復雜度是O(n^3),四邊形不等式程序中跑一遍i只會跑一遍j,所以可以優化到O(n^2)



詳細證明:

http://baike.baidu.com/view/1985058.htm?fr=aladdin

http://blog.csdn.net/lmyclever/article/details/6677683


經典的石子合并問題:http://blog.csdn.net/acdreamers/article/details/18039073


HDOJ2829

題目大意:給定一個長度為n的序列,至多將序列分成m段,每段序列都有權值,權值為序列內兩個數兩兩相乘之和。m<=n<=1000. 令權值最小。

狀態轉移方程:

dp[c][i]=min(dp[c][i],dp[c-1][j]+w[j+1][i])

[cpp]?view plaincopy
  1. #include?<iostream>??
  2. #include?<cstdio>??
  3. #include?<cstring>??
  4. using?namespace?std;??
  5. const?int?INF=1<<30;??
  6. const?int?MAXN=1000+10;??
  7. typedef?long?long?LL;??
  8. LL?dp[MAXN][MAXN];//dp[c][j]表示前j個點切了c次后的最小權值??
  9. int?val[MAXN];??
  10. int?w[MAXN][MAXN];//w[i][j]表示i到j無切割的權值??
  11. int?s[MAXN][MAXN];//s[c][j]表示前j個點切的第c次的位置??
  12. int?sum[MAXN];??
  13. int?main()??
  14. {??
  15. ????int?n,m;??
  16. ????while(~scanf("%d%d",&n,&m))??
  17. ????{??
  18. ????????if(n==0&&m==0)break;??
  19. ????????memset(s,0,sizeof(s));??
  20. ????????memset(w,0,sizeof(w));??
  21. ????????memset(dp,0,sizeof(dp));??
  22. ????????memset(sum,0,sizeof(sum));??
  23. ????????for(int?i=1;i<=n;++i)??
  24. ????????{??
  25. ????????????scanf("%d",&val[i]);??
  26. ????????????sum[i]+=sum[i-1]+val[i];??
  27. ????????}??
  28. ????????for(int?i=1;i<=n;++i)??
  29. ????????{??
  30. ????????????w[i][i]=0;??
  31. ????????????for(int?j=i+1;j<=n;++j)??
  32. ????????????{??
  33. ????????????????w[i][j]=w[i][j-1]+val[j]*(sum[j-1]-sum[i-1]);??
  34. ????????????}??
  35. ????????}??
  36. ????????for(int?i=1;i<=n;++i)??
  37. ????????{??
  38. ????????????for(int?j=1;j<=m;++j)??
  39. ????????????{??
  40. ????????????????dp[j][i]=INF;??
  41. ????????????}??
  42. ????????}??
  43. ????????for(int?i=1;i<=n;++i)??
  44. ????????{??
  45. ????????????dp[0][i]=w[1][i];??
  46. ????????????s[0][i]=0;??
  47. ????????}??
  48. ????????for(int?c=1;c<=m;++c)??
  49. ????????{??
  50. ????????????s[c][n+1]=n;//設置邊界??
  51. ????????????for(int?i=n;i>c;--i)??
  52. ????????????{??
  53. ????????????????int?tmp=INF,k;??
  54. ????????????????for(int?j=s[c-1][i];j<=s[c][i+1];++j)??
  55. ????????????????{??
  56. ????????????????????if(dp[c-1][j]+w[j+1][i]<tmp)??
  57. ????????????????????{??
  58. ????????????????????????tmp=dp[c-1][j]+w[j+1][i];//狀態轉移方程,j之前切了c-1次,第c次切j到j+1間的??
  59. ????????????????????????k=j;??
  60. ????????????????????}??
  61. ????????????????}??
  62. ????????????????dp[c][i]=tmp;??
  63. ????????????????s[c][i]=k;??
  64. ????????????}??
  65. ????????}??
  66. ????????printf("%d\n",dp[m][n]);??
  67. ????}??
  68. ????return?0;??
  69. }??

總結

以上是生活随笔為你收集整理的平行四边形优化的全部內容,希望文章能夠幫你解決所遇到的問題。

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