第十一屆河南省賽---修路
阿新 • • 發佈:2018-12-15
3696: 修路
時間限制: 3 Sec 記憶體限制: 128 MB 提交: 7 解決: 5 [提交][狀態][討論版][命題人:外部匯入][Edit] [TestData]
題目描述
SNJ位於HB省西部一片群峰聳立的高大山地,橫亙於A江、B水之間,方圓數千平方公里,相傳上古的神醫在此搭架上山採藥而得名。景區山峰均在海拔3000米以上,堪稱"華中屋脊"。SNJ是以秀綠的亞高山自然風光,多樣的動植物種,人與自然和諧共存為主題的森林生態區。
SNJ處於中國地勢第二階梯的東部邊緣,由大巴山脈東延的餘脈組成中高山地貌,區內山體高大,高低不平。 交通十分不便。
最近,HB省決定修一條從YC市通往SNJ風景區的高速公路。經過勘測分析,途中需要經過高度分別為H1,H2,……Hn的N個山區。由於高低不平,除正常的修路開支外,每段還要多出高度差|Hi - Hi-1|*X萬元的斜坡費用。Dr. Kong 決定通過填高一些區域的高度來降低總的費用。當然填高也是需要一些費用的。每填高Y單位,需要付出Y2萬元費用。
你能否幫Dr. Kong做出一個規劃,通過部分填高工程改造,使得總的費用降下來。
輸入
第一行: T 表示以下有T組測試資料 ( 1≤ T ≤8 ) 對每組測試資料, 第一行:N X (2 ≤ N ≤100,000 1≤ X ≤100) 第二行:N個整數,分別表示N個區域的高度Hi ( 1<=Hi<=100 i=1…. n)
輸出
對每組測試資料,輸出佔一行,一個整數,即經過部分填高工程改造後的最少費用。
樣例輸入
1 5 2 2 3 5 1 4
樣例輸出
15
#include<bits/stdc++.h> using namespace std; int a[100005]; int dp[100005][100]; int main() { int t,n,m; cin>>t; while(t--) { cin>>n>>m; int maxx=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); maxx=max(maxx,a[i]); } for(int i=a[0];i<=maxx;i++){ dp[0][i]=(i-a[0])*(i-a[0]); } for(int i=1;i<n;i++) { for(int j=a[i];j<=maxx;j++){ dp[i][j]=0xffffff; for(int k=a[i-1];k<=maxx;k++){ dp[i][j]=min(dp[i-1][k]+abs(j-k)*m,dp[i][j]); } dp[i][j]+=(j-a[i])*(j-a[i]); } } int sum=0xffffff; for(int i=a[n-1];i<=maxx;i++){ sum=min(sum,dp[n-1][i]); } cout<<sum<<endl; } }