您的位置:首页 > 其它

Making the Grade POJ 3666 求非严格递减的序列最小值

2017-05-11 11:10 387 查看
题意:有n个数,然后将之变为非严格递减或者严格递增的序列

这个题比较弱,然后只用非递减 就好了

dp[i][j]:前i个数的序列,最后一个数是第j大的数的最小值

dp[i][j]=min(dp[i-1][k])+abs(a[i]-b[j]);(1<=k<=j);

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 2005;
const long long inf= 0x3f3f3f3f;
int a[maxn],b[maxn];
long long dp[maxn][maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
{
long long temp=inf;
for(int j=1;j<=n;j++)
{
temp=min(temp,dp[i-1][j]);
dp[i][j]=temp+abs(b[j]-a[i]);
}
}
long long ans=inf;
for(int i=1;i<=n;i++) ans=min(ans,dp
[i]);
printf("%lld\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: