河南省第十一届ACM程序设计竞赛 修路
Problem C: 修路
Time Limit: 3 Sec??Memory Limit: 128 MBSubmit: 63??Solved: 22
[Submit][Status][Web Board]
Description
SNJ位于HB省西部一片群峰聳立的高大山地,橫亙于A江、B水之間,方圓數千平方公里,相傳上古的神醫在此搭架上山采藥而得名。景區山峰均在海拔3000米以上,堪稱"華中屋脊"。SNJ是以秀綠的亞高山自然風光,多樣的動植物種,人與自然和諧共存為主題的森林生態區。
SNJ處于中國地勢第二階梯的東部邊緣,由大巴山脈東延的余脈組成中高山地貌,區內山體高大,高低不平。 交通十分不便。
最近,HB省決定修一條從YC市通往SNJ風景區的高速公路。經過勘測分析,途中需要經過高度分別為H1,H2,……,Hn的N個山區。由于高低不平,除正常的修路開支外,每段還要多出高度差|Hi - Hi-1|*X萬元的斜坡費用。Dr. Kong 決定通過填高一些區域的高度來降低總的費用。當然填高也是需要一些費用的。每填高Y單位,需要付出Y2萬元費用。
你能否幫Dr. Kong做出一個規劃,通過部分填高工程改造,使得總的費用降下來。
Input
第一行: T 表示以下有T組測試數據 ( 1≤ T ≤8 ) 對每組測試數據, 第一行:N X (2 ≤ N ≤100,000 1≤ X ≤100) 第二行:N個整數,分別表示N個區域的高度Hi ( 1<=Hi<=100 , i=1…. n)
Output
對每組測試數據,輸出占一行,一個整數,即經過部分填高工程改造后的最少費用。
Sample Input
15 2
2 3 5 1 4
Sample Output
15 過了好久,今天終于把這道題補了,期間出過了好幾次。這次必須得會了 具體看注釋,也比較簡單,但是dp思想一直不會。。。。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+5; 4 const int inf=0x3f3f3f3f; 5 int dp[maxn][105],_,n,x,h[maxn];//dp[i][j]表示前i座山,高度為j的最小花費 6 7 int main() { 8 for(scanf("%d",&_);_;_--) { 9 scanf("%d%d",&n,&x); 10 int maxx=-1; 11 for(int i=0;i<n;i++) scanf("%d",&h[i]),maxx=max(h[i],maxx); 12 for(int i=h[0];i<=100;i++) dp[0][i]=(i-h[0])*(i-h[0]);//初始化第0座山的任意高度 13 for(int i=1;i<n;i++) {//遍歷所有山 14 for(int j=h[i];j<=maxx;j++) {//枚舉所有高度 15 dp[i][j]=inf; 16 for(int k=h[i-1];k<=maxx;k++) {//只和i-1有關 17 dp[i][j]=min(abs(j-k)*x+dp[i-1][k],dp[i][j]);//高度差 18 } 19 dp[i][j]+=(j-h[i])*(j-h[i]);//因為當前高度為j,相當于填高了 20 } 21 } 22 int minn=inf; 23 for(int i=h[n-1];i<=maxx;i++) { 24 minn=min(dp[n-1][i],minn);//dp[n-1][*]的最小值即為答案 25 } 26 printf("%d\n",minn); 27 } 28 }?
轉載于:https://www.cnblogs.com/ACMerszl/p/10094849.html
總結
以上是生活随笔為你收集整理的河南省第十一届ACM程序设计竞赛 修路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蒙特卡洛积分与重要性采样详解
- 下一篇: 初学计算几何(四)——初识凸包