HDU 3507 Print Article(斜率优化DP)
生活随笔
收集整理的這篇文章主要介紹了
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下防止文件误删方法
- 下一篇: 你见过动物是怎么笑的吗?赶紧来看看【组图