CodeForces 714E Sonya and Problem Wihtout a Legend(单调数列和DP的小研究)
题意:给你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的小研究)的更多相关文章
- 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 ...
- Codeforces 713C Sonya and Problem Wihtout a Legend(DP)
题目链接 Sonya and Problem Wihtout a Legend 题意 给定一个长度为n的序列,你可以对每个元素进行$+1$或$-1$的操作,每次操作代价为$1$. 求把原序列变成 ...
- codeforces C. Sonya and Problem Wihtout a Legend(dp or 思维)
题目链接:http://codeforces.com/contest/713/problem/C 题解:这题也算是挺经典的题目了,这里附上3种解法优化程度层层递进,还有这里a[i]-i<=a[i ...
- Codeforces 713C Sonya and Problem Wihtout a Legend(单调DP)
[题目链接] http://codeforces.com/problemset/problem/713/C [题目大意] 给出一个数列,请你经过调整使得其成为严格单调递增的数列,调整就是给某些位置加上 ...
- 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 ...
- Codeforces 713C Sonya and Problem Wihtout a Legend
题意:给一个序列,可以进行若干次操作,每次操作选择一个数让它+1或-1,问最少要几次操作使得序列变为严格单调递增序列. 题解:首先考虑非严格递增序列,则每个数字最终变成的数字一定是该数组中的某个数.那 ...
- 【CF713C】Sonya and Problem Wihtout a Legend(离散化,DP)
题意:给你一个数列,对于每个数字你都可以++或者−− 然后花费就是你修改后和原数字的差值,然后问你修改成一个严格递增的,最小花费 思路:很久以前做过一道一模一样的 严格递增很难处理,就转化为非严格递增 ...
- 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 ...
- 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 ...
随机推荐
- MySQL mysql-5.7.21-winx64.zip安装指南
一.下载mysql-5.7.21-winx64.zip压缩包 二.解压 1.在目录mysql-5.7.21-winx64下新建data文件夹 !!!如果已经存在data文件夹,请删除其中ib_logf ...
- [js]$.ajax标准写法
$.ajax({ url:"http://www.microsoft.com", //请求的url地址 dataType:"json", ...
- python 列表反转
反转: 将原列表反转,返回None: li = [1, 2, 3]li.reverse()print(li)# [3, 2, 1]1234不改变原列表,返回反转后的新列表: li = [1, 2, 3 ...
- 第二十六篇 jQuery 学习8 遍历-父亲兄弟子孙元素
jQuery 学习8 遍历-父亲兄弟子孙元素 jQuery遍历,可以理解为“移动”,使用“移动”还获取其他的元素. 什么意思呢?老师举一个例子: 班上30位同学,我是新来负责教这个班学生的老师 ...
- 阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结
更多内容:https://www.toutiao.com/i6599796228886626829/?tt_from=weixin&utm_campaign=client_share& ...
- Struts简介
一.简介 Apache Struts 2最初被称为WebWork 2,它是一个简洁的.可扩展的框架,可用于创建企业级Java web应用程序.设计这个框架是为了从构建.部署.到应用程序维护方面来简化整 ...
- 错误处理:java.lang.NoClassDefFoundError: javax/jms/JMSContext
原因是少包,需要在pom文件增加依赖 <dependency> <groupId>javax.jms</groupId> <artifactId>jav ...
- hbuilder打包集成文件预览
<div class="attachments"> <div class="name">附件</div> <div c ...
- goquery 解析不了noscript
今天在用goquery的时候 解析noscript标签的时候.发现一直获取不到里面的元素. google得到.需要去除noscript标签. s.Find("noscript"). ...
- 小程序UI设计(10)-巧用模板,事半功倍
工具中为小程序员们准备了符合微信开发规范的模板.之前帖子中介绍的规范都在模板中已经设计好了,可以直接复制粘贴使用.下图中的样式是从模板直接复制过来的.实际使用时只要更换为自己的图片和文字即可.自动生成 ...