POJ 3666 Making the Grade (DP滚动数组)
题意:农夫约翰想修一条尽量平缓的路,路的每一段海拔是A[i],修理后是B[i],花费|A[i] – B[i]|,求最小花费。(数据有问题,代码只是单调递增的情况)
1 #include <stdio.h> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <memory> 7 #include <iostream> 8 #define LL long long 9 using namespace std; 10 int a[2010]; 11 int b[2010]; 12 int dp[2][2010];//滚动数组优化 13 int main() { 14 int n; 15 while(~scanf("%d",&n)) { 16 for(int i=0; i<n; i++) { 17 scanf("%d",&a[i]); 18 b[i]=a[i]; 19 } 20 sort(b,b+n); 21 for(int i=0; i<n; i++) { 22 dp[0][i]=abs(a[0]-b[i]); 23 } 24 for(int i=0; i<n; i++) { 25 int cur=i&0x1;//奇偶区别 26 int pre=(i-1)&0x1; 27 int ans=dp[pre][0]; 28 for(int j=0; j<n; j++) { 29 ans=min(dp[pre][j],ans); 30 dp[cur][j]=ans+abs(a[i]-b[j]);//状态转移方程i表示在前i个数的情况下,最后一个是第j小的最小花费 31 } 32 } 33 int N=(n-1)&0x1; 34 // printf("%d\n",dp[N][n-1]); 35 cout<<*min_element(dp[N],dp[N]+n)<<endl; 36 } 37 return 0; 38 }