题意:给你n个数字,每个数字可以加减任何数字,付出变化差值的代价,求最后整个序列是严格单调递增的最小的代价。

  首先我们要将这个题目进行转化,因为严格单调下是无法用下面这个dp的方法的,因此我们转化成非严格的,对严格下而言,a[j]-a[i]>=j-i,那么得到a[i]-i<=a[j]-j。这样,我们令a'[i] = a[i] - i,就可以得到a'[i]<=a'[j]。这样我们就把问题转化成求这样一个非严格单调的序列了。

  将整个序列排序后构成一个新的数组b[i],用dp[i][j]来表示到第 i 个数字的时候,这个数字正好是b[j]或者比b[j]更小的最小代价。那么我们可以得到转移方程如下:dp[i][j]可以从dp[i][j-1]转化而来,因为b数组是单调的,所以既然 i 这个位置更小了,后面的肯定也满足单调,那么就可以直接转化了,或者说dp[i][j]可以从dp[i][k](1<=k<=j-1)中的最小值转化而来,另外dp[i][j]可以由dp[i-1][j]+abs(a[i]-b[j])转化过来,也就是说,前i-1个已经满足,那么第 i 个变成b[j]即可,当然这付出的代价是abs(a[i]-b[j])。这样我们就把dp过程写好了,复杂度是O(n^2),我们还可以把b数组进行去重处理以优化。另外我们还可以用滚动数组来优化空间复杂度。

  具体见代码:

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = + ; ll dp[][N];
ll a[N];
vector<ll> V; int main()
{
memset(dp,,sizeof(dp));
int n;
cin >> n;
for(int i=;i<=n;i++)
{
scanf("%I64d",a+i);
a[i] -= i;
V.push_back(a[i]);
}
sort(V.begin(),V.end());
V.erase(unique(V.begin(),V.end()),V.end());
int now = , pre = ;
for(int i=;i<=n;i++)
{
now ^= , pre ^= ;
dp[now][] = dp[pre][] + abs(a[i]-V[]);
for(int j=;j<V.size();j++)
{
dp[now][j] = min(dp[now][j-],dp[pre][j]+abs(a[i]-V[j]));
}
}
cout << dp[now][V.size()-] << endl;
return ;
}

  另外poj3666也是类似的,那个题目的意思是,把序列变成非严格递增或递减,需要的最小代价。那么我们连转化都不需要了,只要再来一遍递减的就可以了(话说很多人的博客说这题的数据水,只要处理完递增的就可以了)。

  再看类似的一题,hdu5256。现在不是求最小代价了,而是求最少需要变化几个元素使得满足严格递增。套路还是一样的,我们先装化成非严格的套路来。之后我们求出其最长不下降序列(就是把LIS的过程中换成upper_bound即可)的个数t,答案就是len-t。仔细琢磨一下的话还是觉得非常奥义的!

CodeForces 714E Sonya and Problem Wihtout a Legend(单调数列和DP的小研究)的更多相关文章

  1. Codeforces 713C Sonya and Problem Wihtout a Legend DP

    C. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...

  2. Codeforces 713C Sonya and Problem Wihtout a Legend(DP)

    题目链接   Sonya and Problem Wihtout a Legend 题意  给定一个长度为n的序列,你可以对每个元素进行$+1$或$-1$的操作,每次操作代价为$1$. 求把原序列变成 ...

  3. codeforces C. Sonya and Problem Wihtout a Legend(dp or 思维)

    题目链接:http://codeforces.com/contest/713/problem/C 题解:这题也算是挺经典的题目了,这里附上3种解法优化程度层层递进,还有这里a[i]-i<=a[i ...

  4. Codeforces 713C Sonya and Problem Wihtout a Legend(单调DP)

    [题目链接] http://codeforces.com/problemset/problem/713/C [题目大意] 给出一个数列,请你经过调整使得其成为严格单调递增的数列,调整就是给某些位置加上 ...

  5. Codeforces C. Sonya and Problem Wihtout a Legend(DP)

    Description Sonya was unable to think of a story for this problem, so here comes the formal descript ...

  6. Codeforces 713C Sonya and Problem Wihtout a Legend

    题意:给一个序列,可以进行若干次操作,每次操作选择一个数让它+1或-1,问最少要几次操作使得序列变为严格单调递增序列. 题解:首先考虑非严格递增序列,则每个数字最终变成的数字一定是该数组中的某个数.那 ...

  7. 【CF713C】Sonya and Problem Wihtout a Legend(离散化,DP)

    题意:给你一个数列,对于每个数字你都可以++或者−− 然后花费就是你修改后和原数字的差值,然后问你修改成一个严格递增的,最小花费 思路:很久以前做过一道一模一样的 严格递增很难处理,就转化为非严格递增 ...

  8. Codeforces Round #371 (Div. 1) C. Sonya and Problem Wihtout a Legend 贪心

    C. Sonya and Problem Wihtout a Legend 题目连接: http://codeforces.com/contest/713/problem/C Description ...

  9. Codeforces Round #371 (Div. 2)E. Sonya and Problem Wihtout a Legend[DP 离散化 LIS相关]

    E. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...

随机推荐

  1. linq to xml运用示例

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...

  2. VS2019 快捷键

    工欲善其事,必先利其器,整理了下VS最常用的快捷键,查看了不少资料,汇总了下,没有的自己补充,可以打印,用Excel编辑的. 可编辑版本下载:Excel文件下载 你可能需要查询其他的快捷键,MSDN介 ...

  3. canva绘制圆角矩形

    在做组态的时候,需要支持矩形圆角格式,但是因为canvas本身不带有圆角矩形,需要自行算出坐标进行绘制 方案一.统一圆角 <!DOCTYPE html> <html> < ...

  4. js把一串字符串去重(能统计出字符重复次数更佳)

    原文来自:https://juejin.im/post/5ba6e77e6fb9a05d0b14359b <script> let str = "12qwe345671dsfa2 ...

  5. winfrom 操作Excel

    利用Aspose.Cells.dll 操作Excel,内容如下: 1.界面设计: 2.逻辑: using System; using System.Collections.Generic; using ...

  6. mysql精准模糊查询使用CONCAT加占位符(下划线“_”)的使用,直接限定了长度和格式

    比如现在有张表t_user,如下:(表中只是引用某某某的话,并无恶意) id name 1 司马懿 2 司马老贼 3 司马老贼OR司马懿 4 司马大叔 1.模糊查询一般用的模糊查询都是like关键词, ...

  7. mysql 中的 tinyint 字段

    只能存储  -128 ~ 127  之间的数字

  8. conda创建和使用python的虚拟环境

    https://uoa-eresearch.github.io/eresearch-cookbook/recipe/2014/11/20/conda/ 当我们使用服务器的时候,会存在多个用户,并且可能 ...

  9. asyncio:python3未来并发编程主流、充满野心的模块

    介绍 asyncio是Python在3.5中正式引入的标准库,这是Python未来的并发编程的主流,非常重要的一个模块.有一个web框架叫sanic,就是基于asyncio,语法和flask类似,使用 ...

  10. [Nginx]子目录反向代理kibana并添加basic认证

    背景 服务器ip:192.168.1.2 安装软件 nginx kibana(默认端口5601) 实现方案:访问http://192.168.1.2/kibana 即可访问到kibana后端,同时需要 ...