-
Making the Grade
- POJ - 3666
- 题意:给定A序列然后每个位置都一个高度,重新在每个位置选定一个高度使得整个序列为单调的,
- 思路:不可以按照高度去枚举只能选择这给定的n的点的高度,(这就是离散化过程,不是真正离散化只是有点离散思想),
- 之所以能这样是因为话费为每个位置改变的绝对值为了尽可能的小改变后的高度一定为原来序列中已经有的高度了,
- 例如有有一个序列 3 ,2, 105 需要变2,2有很多选择在3-105之间,
- 但是为了尽可能小的话费还是把2变为已经有的3就好了,
- 这样就是一个单调序列了,(单调一般指>= 或<=)然后DP时此次更新需要从前面比它低的高度中选择一个,
- 因为 i只与i-1有关系可以滚动数组优化一下
-
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define maxn 2222 #define inf 0x3f3f3f3f #define ll long long ll dp[3][maxn],maxx; ll b[maxn],n,a[maxn]; int main() { scanf("%lld",&n); for(int i=0; i<n; i++) { scanf("%lld",&a[i]); b[i]=a[i]; } sort(b,b+n); int orz=0; ll ans=inf; for(int i=0; i<n; i++) { maxx=inf; for(int j=0; j<n; j++) { maxx=min(dp[orz][j],maxx); dp[orz^1][j]=maxx+fabs(a[i]-b[j]); if(i==n-1)ans=min(ans,dp[orz^1][j]); } orz^=1; } printf("%lld\n",ans); return 0; }
Making the Grade POJ -DP-离散化
最新推荐文章于 2021-07-07 10:06:19 发布