您的位置:首页 > 其它

POJ3666(动态规划)

2016-07-21 23:26 405 查看
题目:

C - Making the Grade
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld
& %llu
Submit Status Practice POJ
3666

Appoint description: 
System Crawler  (Jul 21, 2016 8:46:26 AM)

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: N

* Lines 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


题意  :把一列数编程非严格单调序列所需要的最小花费。

思路:代码只求了了非递减序列的情况,但也能过。另一半同理。a为原始数列,b为排序过的数列。设dp[i][j]为把前i+1个数变成单调序列且最大为B[j]的最小花费。可以由哪些状态转移过来?

显然从dp[i-1][k]转移过来的时候,要使最大的为B[j],就只要把a[i]改成b[j]就成。所以dp[i][j]=min(dp[i-1][k])+abs(a[i]-b[j])

<span style="font-size:14px;">#include <cmath>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <string>
#include <set>
#include <cmath>

#define MAXN 2010
using namespace std;
int a[MAXN],b[MAXN];
int dp[MAXN][MAXN];//dp[i][j]为前把前i+1个数变为单调序列且最大数是B[j],此时的最小成本
//dp[i][j]=min(dp[i-1][k])+|a[i]-b[j]|

int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",a+i);
b[i]=a[i];
}
sort(b, b+n);
for(int j=0;j<n;j++)
dp[0][j]=abs((double)(a[0]-b[j]));
for(int i=1;i<n;i++)
{
int minn=dp[i-1][0];
for(int j=0;j<n;j++)
{
minn=min(minn,dp[i-1][j]);
dp[i][j]=minn+abs((double)(a[i]-b[j]));
}
}
printf("%d\n",*min_element(dp[n-1], dp[n-1]+n));
return 0;
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: