博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 713C Sonya and Problem Wihtout a Legend(单调DP)
阅读量:4919 次
发布时间:2019-06-11

本文共 937 字,大约阅读时间需要 3 分钟。

 

【题目链接】 

 

【题目大意】

  给出一个数列,请你经过调整使得其成为严格单调递增的数列,调整就是给某些位置加上或者减去某个数,调整的代价是加上或者减去的数的绝对值之和,请你输出最小代价。

 

【题解】

  先考虑这样一个问题,如果是非严格单调递增该如何做,我们会发现每次调整,都是调整某个数字为原先数列中存在的数字,最后才是最优的,所以,我们设DP[i][j]表示前i个数字,最后一个数为原先数列排序后第j大的数字的最小代价,那么做一遍n2的DP就能够获得答案,现在题目中要求的是严格单调递增,那么就用到一种经典的处理方法,a[i]=a[i]-i,这样子就转化为非严格单调的问题了。

 

【代码】

#include 
#include
using namespace std; const int N=3010; int n,a[N],b[N]; long long dp[N][N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",a+i); a[i]-=i; b[i]=a[i]; }sort(b+1,b+n+1); for(int i=1;i<=n;i++){ long long mn=dp[i-1][1]; for(int j=1;j<=n;j++){ mn=min(mn,dp[i-1][j]); dp[i][j]=abs(a[i]-b[j])+mn; } }long long ans=dp[n][1]; for(int i=1;i<=n;i++)ans=min(ans,dp[n][i]); printf("%I64d\n",ans); return 0; }

  

转载于:https://www.cnblogs.com/forever97/p/codeforces713c.html

你可能感兴趣的文章
bootstrap radio
查看>>
mobileSelect.js 运用 input 不让吊起小键盘
查看>>
cropper.js图片裁剪——第二弹
查看>>
axios 请求数据 入门级介绍
查看>>
PHP学习笔记
查看>>
kali安装vmtool后依旧无法拖拽文件,复制粘贴,解决办法
查看>>
【编程范式】函数式基础图示
查看>>
【JS语法】作用域与绑定图示
查看>>
未在本地计算机注册vfpoledb
查看>>
sql server 日期
查看>>
置换元素与非置换元素
查看>>
不支持事件冒泡的事件
查看>>
JavaScript中的for..in以及for...of
查看>>
JavaScript中in和hasOwnProperty的区别
查看>>
JavaScript 中 call()、apply()、bind() 的用法
查看>>
javascript中实现继承的6种方式
查看>>
CSS水平垂直居中常见方法总结(转)
查看>>
如何居中浮动元素
查看>>
rgba()和opacity的区别
查看>>
盒子模型以及css3指定盒子模型种类的box-sizing
查看>>