标签:dp
刚开始想到要把结果作为状态,但a[i]的取值范围太大,所以一直没想出来,然后搜了个解题报告,看到要离散化,于是又回来想。
最后设了个自己都不太确定思路有没有问题的状态,抱着试一试的心态提交上去,然后就A了,也是醉了
dp[i][j]:前i个数,前j个高度的最小值
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; const int inf=2000000000; int n,a[2005],dp[2005][2005],y[2005]; //dp[i][j]:前i个数,前j个高度的最小值 void init(){ for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ dp[i][j]=inf; } } for(int i=1;i<=n;i++) dp[0][i]=0; } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); y[i]=a[i]; } sort(y+1,y+n+1); init(); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dp[i][j]=min(dp[i-1][j]+abs(a[i]-y[j]),dp[i][j-1]); } } int ans=inf; for(int i=1;i<=n;i++) ans=min(dp[n][i],ans); printf("%d\n",ans); }
标签:dp
原文地址:http://blog.csdn.net/lj94093/article/details/45673991