bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)
生活随笔
收集整理的這篇文章主要介紹了
bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1705: [Usaco2007 Nov]Telephone Wire 架設電話線
Time Limit:?5 Sec??Memory Limit:?64 MBSubmit:?441??Solved:?247
[Submit][Status][Discuss]
Description
最近,Farmer John的奶牛們越來越不滿于牛棚里一塌糊涂的電話服務 于是,她們要求FJ把那些老舊的電話線換成性能更好的新電話線。 新的電話線架設在已有的N(2 <= N <= 100,000)根電話線桿上, 第i根電話線桿的高度為height_i米(1 <= height_i <= 100)。 電話線總是從一根電話線桿的頂端被引到相鄰的那根的頂端 如果這兩根電話線桿的高度不同,那么FJ就必須為此支付 C*電話線桿高度差(1 <= C <= 100)的費用。當然,你不能移動電話線桿, 只能按原有的順序在相鄰桿間架設電話線。Farmer John認為 加高某些電話線桿能減少架設電話線的總花費,盡管這項工作也需要支出一定的費用。 更準確地,如果他把一根電話線桿加高X米的話,他得為此付出X^2的費用。 請你幫Farmer John計算一下,如果合理地進行這兩種工作,他最少要在這個電話線改造工程上花多少錢。
Input
* 第1行: 2個用空格隔開的整數:N和C
* 第2..N+1行: 第i+1行僅有一個整數:height_i
Output
* 第1行: 輸出Farmer John完成電話線改造工程所需要的最小花費
Sample Input
5 22
3
5
1
4
輸入說明:
一共有5根電話線桿,在桿間拉電話線的費用是每米高度差$2。
在改造之前,電話線桿的高度依次為2,3,5,1,4米。
Sample Output
15輸出說明:
最好的改造方法是:Farmer John把第一根電話線桿加高1米,把第四根加高2米,
使得它們的高度依次為3,3,5,3,4米。這樣花在加高電線桿上的錢是$5。
此時,拉電話線的費用為$2*(0+2+2+1) = $10,總花費為$15。 /* f[i][j] = min(f[i-1][k]+|j-k|*c+(a[i]-j)*(a[i]-j)) 摘出與k無關項得 f[i][j] = min(f[i-1][k]+|j-k|*c) + (a[i]-j)*(a[i]-j) 記P = min(f[i-1][k]+|j-k|*c) , Q = (a[i]-j)*(a[i]-j) 則f[i][j] = P + Q P = min(A,B),其中 A = min(f[i-1][k]+(j-k)*c) (k<=j) B = min(f[i-1][k]+(k-j)*c) (k>j) A = min(f[i-1][k]-k*c) + j*c B = min(f[i-1][k]+k*c) - j*c 記C[X][i] = min(f[X][k] - k*c) k∈[1,i] 記D[X][i] = min(f[X][k] + k*c) k∈[i,n] 則A = C[i-1][j] + j*c 則B = D[i-1][j+1] - j*c 顯然C、D在任何時刻只需保存X=i-1一行的值 注意高度只能增高,所以h[i]∈[a[i],100] 利用輔助數組優化后,時間復雜度降為O(N*100) */ #include<iostream> #include<cstdio> #include<cstring>#define N 100010 #define H 110 #define inf 0x3f3f3f3fusing namespace std; int n,c,h,P,Q,A,B; int a[N],C[H],D[H],f[N][H];int main() {scanf("%d%d",&n,&c);for(int i=1;i<=n;i++) scanf("%d",&a[i]);h=a[1];for(int i=1;i<=n;i++) h=max(h,a[i]);h=min(h,100);memset(f,0x3f,sizeof f);for(int i=1;i<=n;i++){if(i==1) for(int j=a[i];j<=h;j++)f[1][j]=(j-a[1])*(j-a[1]);else{for(int j=a[i];j<=h;j++){Q=(j-a[i])*(j-a[i]);A=C[j]+j*c;B=D[j+1]-j*c;P=min(A,B);f[i][j]=P+Q;}}C[0]=D[h+1]=inf;for(int j=1;j<=h;j++) C[j]=min(C[j-1],f[i][j]-j*c);for(int j=h;j>=1;j--) D[j]=min(D[j+1],f[i][j]+j*c);}int ans=inf;for(int i=1;i<=h;i++) ans=min(ans,f[n][i]);printf("%d\n",ans);return 0;return 0;return 0; }
?
轉載于:https://www.cnblogs.com/L-Memory/p/7337521.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leancloud的技术面试指南
- 下一篇: web面试常见问题补充