给定一个序列,以最小代价将其变成单调不增或单调不减序列,这里的代价看题目公式
DP方程:dp[i][j]=abs(a[i]-b[j])+min(dp[i-1][k]);(k<=j) 前i个位置,结尾用b[j]的最小代价
详细题解:http://blog.csdn.net/wuyanyi/article/details/7255154
#include "stdio.h" #include "string.h" #include "algorithm" using namespace std; int Abs(int a) { if (a<0) return -a; else return a; } int Min(int a,int b) { if (a<b) return a; else return b; } int dp[2010][2010],a[2010],b[2010]; int main() { int n,i,temp,j; while (scanf("%d",&n)!=EOF) { for (i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]; } sort(b+1,b+1+n); for (i=1;i<=n;i++) dp[i][1]=Abs(a[1]-b[i]); for (i=2;i<=n;i++) { dp[i][1]=dp[i-1][1]+Abs(a[i]-b[1]); temp=dp[i-1][1]; for (j=2;j<=n;j++) { temp=Min(temp,dp[i-1][j]); dp[i][j]=temp+Abs(a[i]-b[j]); } } temp=dp[n][1]; for (i=2;i<=n;i++) temp=Min(temp,dp[n][i]); printf("%d\n",temp); } return 0; }
时间: 2024-08-15 19:25:47