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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 3507 Print Article(斜率优化DP)

發布時間:2025/3/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 3507 Print Article(斜率优化DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

題意 : 一篇文章有n個單詞,如果每行打印k個單詞,那這行的花費是,問你怎么安排能夠得到最小花費,輸出最小花費。

思路 : 一開始想的簡單了以為是背包,后來才知道是斜率優化DP,然后看了網上的資料,看得還挺懂的,不過我覺得如果以后真遇到斜率DP,要推起來肯定不簡單。。。。。

網上資料1

網上資料2

1 #include <iostream> 2 #include <stdio.h> 3 4 using namespace std; 5 6 int q[500005],dp[500005],sum[500005] ; 7 int head,tail,m,n ; 8 9 // dp[i]= min{ dp[j]+M+(sum[i]-sum[j])^2 }; 10 int getDP(int i,int j) 11 { 12 return dp[j] + m + (sum[i]-sum[j]) * (sum[i]-sum[j]) ; 13 } 14 int getUP(int j,int k)//求yj-yk 15 { 16 return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]) ; 17 } 18 int getDOWM(int j,int k)//求xj-xk 19 { 20 return 2*sum[j]-2*sum[k] ; 21 } 22 23 int main() 24 { 25 while(~scanf("%d %d",&n,&m)) 26 { 27 for(int i = 1 ; i <= n ; i++) 28 scanf("%d",&sum[i]) ; 29 sum[0] = dp[0] = 0 ; 30 for(int i = 1 ; i <= n ; i++) 31 sum[i] += sum[i-1] ; 32 head = tail= 0 ; 33 q[tail++] = 0 ; 34 for(int i = 1 ; i <= n ; i++) 35 { 36 //如果滿足g[j,k]=yj-jk/xj-xk<sum[i]代表這j的決策比k的決策要更優,所以k可以直接淘汰了。 37 while(head+1 < tail && getUP(q[head+1],q[head]) <= sum[i] * getDOWM(q[head+1],q[head])) 38 head++ ; 39 dp[i] = getDP(i,q[head]) ; 40 //g[i,j]<g[j,k],那么j點便永遠不可能成為最優解,可以直接將它踢出我們的最優解集。 41 while(head+1 < tail && getUP(i,q[tail-1]) * getDOWM(q[tail-1],q[tail-2]) <= getUP(q[tail-1],q[tail-2]) * getDOWM(i,q[tail-1])) 42 tail-- ; 43 q[tail++] = i ; 44 } 45 printf("%d\n",dp[n]) ; 46 } 47 return 0; 48 } View Code

?

轉載于:https://www.cnblogs.com/luyingfeng/p/3712575.html

總結

以上是生活随笔為你收集整理的HDU 3507 Print Article(斜率优化DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

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