S - Making the Grade POJ - 3666 结论 将严格递减转化成非严格的
S - Making the Grade
这个题目要求把一个给定的序列变成递增或者递减序列的最小代价。
这个是一个dp,对于这个dp的定义我觉得不是很好想,如果第一次碰到的话。
上网看了一下题解,dp[i][j]表示前面 i 位已经是有序的了,第 i+1 位变成第j大的最小代价。
这个转移可以保证有序这个条件。
递增递减d两次。
这个题目要离散化,为什么要离散化呢,推荐博客
我以前就是感觉数据大就要离散化,不然数组存不下,不过看了这篇题解感觉他讲的很对啊。
#include <cstring>
#include <queue>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <vector>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 2e3 + ;
ll dp1[maxn][maxn], dp2[maxn][maxn];
int a[maxn], b[maxn]; int main()
{
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
sort(b + , b + + n);
int len = unique(b + , b + + n) - b - ;
for (int i = ; i <= n; i++) {
for (int j = ; j <= len; j++) {
dp1[i][j] = dp2[i][j] = inf64;
}
}
for (int i = ; i <= len; i++) {
dp1[][i] = abs(b[i] - a[]);
dp2[n][i] = abs(b[i] - a[n]);
}
for(int i=;i<n;i++)
{
ll tmp = inf64;
for(int j=;j<=len;j++)
{
tmp = min(tmp, dp1[i][j]);//这一步我感觉很巧妙,优化了一个for循环,
//这里是再找j前面的最小的那个dp[i][j],因为dp[i][j]=min(dp[i-1][1~j])+abs()
dp1[i + ][j] = min(dp1[i + ][j], tmp + abs(a[i + ] - b[j]));
}
}
ll ans = inf64;
for (int i = ; i <= len; i++) ans = min(ans, dp1[n][i]);
for(int i=n;i>;i--)
{
ll tmp = inf64;
for(int j=;j<=len;j++)
{
tmp = min(tmp, dp2[i][j]);
dp2[i - ][j] = min(dp2[i - ][j], tmp + abs(a[i - ] - b[j]));
}
}
for (int i = ; i <= len; i++) ans = min(ans, dp2[][i]);
printf("%lld\n", ans);
return ;
}
然后还有一个题目和这个很类似,好像比这个要难一点,所以我才先写的这个题目。
C. Sonya and Problem Wihtout a Legend
之前的那篇博客也有推荐
这个题目我居然没有写出来,其实和上面基本上是一样的,只有一点点的区别,上面的是非严格的,这个是严格递增的。
然后我不知道怎么转化,或者说我尝试过了,发现不太对。
然后我就去搜了题解,发现有一种方法可以把严格转化成非严格就是 a[i]-i
这样之后求非严格就可以了,然后要注意因为这个是求差值最小,所以这个不会影响答案,
知道这个就很简单了,这个结论以后不要忘记
#include <cstring>
#include <queue>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <vector>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 3e3 + ;
ll dp[maxn][maxn];
ll a[maxn], b[maxn]; int main()
{
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%lld", &a[i]);
a[i] -= i;
b[i] = a[i];
}
sort(b + , b + + n);
int len = unique(b + , b + + n) - b - ;
for (int i = ; i <= n; i++) {
for (int j = ; j <= len; j++) {
dp[i][j] = inf64;
}
}
for (int i = ; i <= len; i++) dp[][i] = abs(a[] - b[i]);
for(int i=;i<n;i++)
{
ll tmp = inf64;
for(int j=;j<=len;j++)
{
tmp = min(dp[i][j], tmp);
dp[i + ][j] = min(dp[i + ][j], tmp + abs(a[i + ] - b[j]));
}
}
ll ans = inf64;
for (int i = ; i <= len; i++) ans = min(ans, dp[n][i]);
printf("%lld\n", ans);
return ;
}
S - Making the Grade POJ - 3666 结论 将严格递减转化成非严格的的更多相关文章
- A-Making the Grade(POJ 3666)
Making the Grade Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4656 Accepted: 2206 ...
- Making the Grade POJ - 3666
A straight dirt road connects two fields on FJ's farm, but it changes elevation more than FJ would l ...
- DP:Making the Grade(POJ 3666)
聪明的修路方案 题目大意:就是农夫要修一条路,现在要求这条路要么就是上升的,要么就是下降的,总代价为∑|a[i]-b[i]|,求代价最低的修路方案, (0 ≤ β≤ 1,000,000,000) , ...
- 「POJ 3666」Making the Grade 题解(两种做法)
0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...
- Poj 3666 Making the Grade (排序+dp)
题目链接: Poj 3666 Making the Grade 题目描述: 给出一组数,每个数代表当前位置的地面高度,问把路径修成非递增或者非递减,需要花费的最小代价? 解题思路: 对于修好的路径的每 ...
- 把一个序列转换成非严格递增序列的最小花费 POJ 3666
//把一个序列转换成非严格递增序列的最小花费 POJ 3666 //dp[i][j]:把第i个数转成第j小的数,最小花费 #include <iostream> #include < ...
- B - Housewife Wind POJ - 2763 树剖+边权转化成点权
B - Housewife Wind POJ - 2763 因为树剖+线段树只能解决点权问题,所以这种题目给了边权的一般要转化成点权. 知道这个以后这个题目就很简单了. 怎么转化呢,就把这个边权转化为 ...
- POJ - 3666 Making the Grade(dp+离散化)
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- POJ 3666 Making the Grade(二维DP)
题目链接:http://poj.org/problem?id=3666 题目大意:给出长度为n的整数数列,每次可以将一个数加1或者减1,最少要多少次可以将其变成单调不降或者单调不增(题目BUG,只能求 ...
随机推荐
- I/O流之--转换流:InputStreamReader 和InputStreamWriter
I/O流之--转换流:InputStreamReader 和InputStreamWriter 分类: java2014-07-01 15:30 815人阅读 评论(0) 收藏 举报 目录(?)[ ...
- push和appendChild的区别
概述:绑定事件(push和appendChild用法相似:但是一个是控制数组,一个是控制元素节点)用法:1.数组1的更改后的长度 = 数组1.push();//用来控制数组,在数组最后面插入项,返回数 ...
- 程序员小张的第一篇博文 --记Markdown的使用学习
1.前言 为了即将到来的面试做准备,以及记录一下平日里自己的学习过程和生活日常,我开始进驻博客园啦!这就是我的第一篇博客(有点小激动)~ 作为一只新手,首先记录一下今晚的编写博文的学习过程吧~ 2.使 ...
- 使用SVGDeveloper画svg地图详细过程
使用步骤 1. 安装svg 2. 具体操作 1. 打开svg,点击file ,new,默认svg,点击ok 显示界面如下: 然后点击image 把鼠标放到代码下面的的桌面上,鼠标箭头会变成 ...
- L19深度学习中的优化问题和凸性介绍
优化与深度学习 优化与估计 尽管优化方法可以最小化深度学习中的损失函数值,但本质上优化方法达到的目标与深度学习的目标并不相同. 优化方法目标:训练集损失函数值 深度学习目标:测试集损失函数值(泛化性) ...
- Flask接口开发过程中的心得2019.10.03
完善了一下慕课网实战中的post接口开发,得到了一些进步: 代码如下: #coding=utf-8 from flask import Flask from flask import request ...
- 3. css百度制作字体图片
http://fontstore.baidu.com/static/editor/index.html?qq-pf-to=pcqq.group
- [PHP][thinkphp5] 学习一:增删改查
<?php namespace app\index\controller; use think\Controller; use think\Db; class Test extends Cont ...
- SpringMVC数据传递及乱码问题
基础环境搭建请参考SringMVC入门程序 一.SpringMVC数据处理 1:resful 路径传值 http://localhost/get/1/2 /* http://localhost/get ...
- React Hooks: useCallback理解
useCallback把匿名回调“存”起来 避免在component render时候声明匿名方法,因为这些匿名方法会被反复重新声明而无法被多次利用,然后容易造成component反复不必要的渲染. ...