Codeforces 13C Sequence
2016-07-13 14:17
555 查看
http://codeforces.com/contest/13/problem/C
题目大意
给定一个含有N个数的序列,要求你对一些数减掉或者加上某个值,使得序列变为非递减的,问你加减的值的总和最少是多少?
思路:所有数最终构成的集合一定是一开始所有数构成数的集合的子集,因此dp[i][j]代表当前第i个数,递增序列在第j个数的代价。
题目大意
给定一个含有N个数的序列,要求你对一些数减掉或者加上某个值,使得序列变为非递减的,问你加减的值的总和最少是多少?
思路:所有数最终构成的集合一定是一开始所有数构成数的集合的子集,因此dp[i][j]代表当前第i个数,递增序列在第j个数的代价。
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #define ll long long ll f[5005]; int a[5005],p[5005],n; int read(){ int t=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();} return t*f; } int main(){ n=read();for (int i=1;i<=n;i++) a[i]=read(),p[i]=a[i]; std::sort(p+1,p+1+n);int j=1; for (int i=2;i<=n;i++) if (p[i]!=p[i-1]) p[++j]=p[i]; p[0]=j; for (int i=1;i<=n;i++){ for (j=1;j<=p[0];j++){ if (j==1) f[j]+=std::abs(a[i]-p[j]); else f[j]=std::min(f[j-1],f[j]+std::abs(a[i]-p[j])); } } printf("%I64d\n",f[p[0]]); }
相关文章推荐
- UVA - 123 Searching Quickly
- 一些常用的UI控件
- vSphere 6.0: remove partitions from existing storage devices via UI
- android studio 报Error:failed to find Build Tools revision 23.0.0 rc2
- Lesson 6:分支语句和逻辑运算符
- easyui中combobox仅允许使用当前数据值处理
- Kafka connect的offset commit机制
- 日本UX站点Uxmilk.jp对Mockplus的介绍 - 简洁快速的原型图设计工具Mockplus使用指南
- jd-gui在Ubuntu上打不开
- Incorrect string value: '\xE6\x9B\xB9\xE5\x86\xAC.'
- UI开发学习指南
- [LeetCode] Guess Number Higher or Lower 猜数字大小
- UE4源码分析1-下载源码
- 为啥可以在非ui线程也可以更新ui组件??
- Guess Number Higher or Lower
- cocoapods questions I met when update to OS10.11
- ios-坐标系统(详解UIView的frame、bounds跟center属性[图])
- HBuilder使用夜神模拟器调试Android应用
- jsp include 参数混乱,获取到请求主页面的参数了,清空request parameter
- UESTC 2016 Summer Training #1 Div.2(未完待续)