国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

POJ3666-Making the Grade-dp

2019-11-08 03:26:37
字體:
來源:轉載
供稿:網友

原題鏈接 Making the Grade Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6861 Accepted: 3176 Description

A straight dirt road connects two fields on FJ’s farm, but it changes elevation more than FJ would like. His cows do not mind climbing up or down a single slope, but they are not fond of an alternating succession of hills and valleys. FJ would like to add and remove dirt from the road so that it becomes one monotonic slope (either sloping up or down).

You are given N integers A1, … , AN (1 ≤ N ≤ 2,000) describing the elevation (0 ≤ Ai ≤ 1,000,000,000) at each of N equally-spaced positions along the road, starting at the first field and ending at the other. FJ would like to adjust these elevations to a new sequence B1, . … , BN that is either nonincreasing or nondecreasing. Since it costs the same amount of money to add or remove dirt at any position along the road, the total cost of modifying the road is

|A1 - B1| + |A2 - B2| + … + |AN - BN | Please compute the minimum cost of grading his road so it becomes a continuous slope. FJ happily informs you that signed 32-bit integers can certainly be used to compute the answer.

Input

Line 1: A single integer: NLines 2..N+1: Line i+1 contains a single integer elevation: Ai

Output

Line 1: A single integer that is the minimum cost for FJ to grade his dirt road so it becomes nonincreasing or nondecreasing in elevation.

Sample Input

7 1 3 2 4 5 3 9 Sample Output

3 Source

USACO 2008 February Gold

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 2000 + 10;const int INF = 0x3f3f3f3f;int dp[2][maxn],a[maxn],b[maxn];// a數組是原數組,b數組是a數組排序后的數組// 實際上a[i]變化后的結果就是成為b數組中某個位置的一個值而已,所以我們的定義dp[i][j]為在前i-1個已經// 有序的數組中將當前位置變化為b[j]位置的數的最小花費,由于dp[i-1][k]代表的序列已經有序(0<=k<=j),// 所以只需要考慮當前改變的消耗,dp[i][j] = min{dp[i-1][k]} + | a[i] - b[j] | 0<=k<=j// 當然其實由于引入了前j-1最小其實我們還可以把dp寫成一維的形式int _abs(int x){ return x > 0 ? x : -x;}bool cmp(int x,int y){ return x > y ? true : false;}int main(){ int n; while(scanf("%d",&n)==1){ for(int i=0;i<n;i++) {scanf("%d",&a[i]);b[i]=a[i];} int res = INF; memset(dp,0,sizeof(dp)); sort(b,b+n);//先處理升序的情況 for(int i=0;i<n;i++){ int PRe_min = dp[(i+1)&1][0]; dp[i&1][0] = dp[(i+1)&1][0] + _abs(a[i] - b[0]); for(int j=1;j<n;j++){ pre_min = min(pre_min,dp[(i+1)&1][j]); dp[i&1][j] = pre_min + _abs(a[i] - b[j]); } } for(int i=0;i<n;i++) res = min(res,dp[(n-1)&1][i]); memset(dp,0,sizeof(dp)); sort(b,b+n,cmp);//再處理降序的情況 for(int i=0;i<n;i++){ int pre_min = dp[(i+1)&1][0]; dp[i&1][0] = dp[(i+1)&1][0] + _abs(a[i] - b[0]); for(int j=1;j<n;j++){ pre_min = min(pre_min,dp[(i+1)&1][j]); dp[i&1][j] = pre_min + _abs(a[i] - b[j]); } } for(int i=0;i<n;i++) res = min(res,dp[(n-1)&1][i]); cout << res << endl; } return 0;}
上一篇:313. Super Ugly Number

下一篇:Ural 2062

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 建瓯市| 罗田县| 中卫市| 邮箱| 剑川县| 巴彦淖尔市| 时尚| 江油市| 汕头市| 浠水县| 仁寿县| 新竹市| 公主岭市| 千阳县| 平昌县| 皮山县| 宽城| 太保市| 洛南县| 上犹县| 进贤县| 滨州市| 湖口县| 大庆市| 观塘区| 阜城县| 安多县| 汾阳市| 新兴县| 林西县| 乐安县| 西贡区| 尉犁县| 思茅市| 伊吾县| 镇安县| 高尔夫| 呼和浩特市| 门源| 天峨县| 和静县|