1. 程式人生 > >第十一屆河南省賽---修路

第十一屆河南省賽---修路

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;
    }
}