poj3666(dp前缀优化)
2016-05-31 17:35
316 查看
链接:点击打开链接
题意:将A1....An变为B1.....Bn,要求序列B满足非严格单调递增或非严格单调递减,代价为|A1-B1|+|A2-B2|+...+|AN -BN|,输出最小代价
代码:
题意:将A1....An变为B1.....Bn,要求序列B满足非严格单调递增或非严格单调递减,代价为|A1-B1|+|A2-B2|+...+|AN -BN|,输出最小代价
代码:
#include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; int a[2005],b[2005],dp[2005][2005]; int main(){ //dp[i][j]表示第i个数高度为第j个时的代价 int n,i,j,ans,tmp; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++){ scanf("%d",&a[i]); b[i]=a[i]; } //变化后递增 sort(b,b+n); //最优情况变换后的值一定出现在原来的数列中 for(i=0;i<n;i++) dp[0][i]=abs(a[0]-b[i]); for(i=1;i<n;i++){ tmp=INF; for(j=0;j<n;j++){ tmp=min(tmp,dp[i-1][j]); //高度j之前的最小值,减少了一次循环 dp[i][j]=tmp+abs(a[i]-b[j]); } } ans=INF; for(i=0;i<n;i++) ans=min(ans,dp[n-1][i]); sort(b,b+n,greater<int>()); //变换后递减 for(i=0;i<n;i++) dp[0][i]=abs(a[0]-b[i]); for(i=1;i<n;i++){ tmp=INF; for(j=0;j<n;j++){ tmp=min(tmp,dp[i-1][j]); dp[i][j]=tmp+abs(a[i]-b[j]); } } for(i=0;i<n;i++) ans=min(ans,dp[n-1][i]); printf("%d\n",ans); } return 0; }
相关文章推荐
- 如何安装linux mint/ubuntu windows系统
- linux ftp设置
- Django 登陆访问权限@login_required
- Hadoop学习-基础环境搭建
- c++实现归并排序
- js关闭浏览器的tab页(兼容)
- jquery.min.js:2 Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: blank
- PDO事务处理
- Kafka安装部署
- Android ORM 框架之 greenDAO 使用心得
- MVC
- 矩阵分析与应用
- (面试)架构相关(不断丰富中… )
- 工作量证明算法
- 在软件开发流程中构筑卓越质量--软件测试管理(深圳,2016.6.24~25)
- Android Dev Intro - Opengl ES and EGL
- iOS OC中获取100以内的所有合数,获取某个合数的所有因数.
- 高速C/C++编译工具ccache
- poj 2187 Beauty Contest(凸包)
- terminator 安装与配置