最小调整代价-lintcode(c++)
2021-06-22 23:03
标签:最优 意义 lintcode 百度搜索 个数 时间 一个 穷举法 ace lintcode91:最小调整代价 思路分析: 如何存放数据? 如果构造最优子结构? 过程中的问题:知道思路之后写这个程序还是花了很长的时间,大约一个多小时。主要的原因是不明白m[i][j]是什么意思。此处说明一下,m[i][j]表示的含义是第i个数据,如果是j需要调整的最少次数。数据从i-1个到i个有意义的条件是A[i-1]和A[i]的绝对值之差小于target。(A表示数据) 代码如下 int MinAdjustmentCost(vector if(A.size() == 1 || A.size() == 0) //建立存放的容器 //初始化数据 //循环获取数据 } Solution s; 最小调整代价-lintcode(c++) 标签:最优 意义 lintcode 百度搜索 个数 时间 一个 穷举法 ace 原文地址:https://www.cnblogs.com/qiny1012/p/9676816.html
给一个整数数组,调整每个数的大小,使得相邻的两个数的差不大于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。
例如:对于数组[1, 4, 2, 3]和target=1,最小的调整方案是调整为[2, 3, 2, 3],调整代价之和是2。返回2。
例如:对于数组[1, 5, 6]和target=1,最小的调整方案为[4,5,6],调整代价之和是3.返回3.
如何去构造最优子结构?如何存放数据?
对于这些问题,我想了一个小时,也没有想出个所以然。先说一下我自己的理解,开始的时候没有读清题意,认为修改一次的代价是1,1->2代价为1,2->5代价为1.印象中依稀记得动态规划算法实际上是对穷举法的变形。而具有n个数据的数组,最大的调整次数是n,最小的调整次数是0;如果采用穷举法,一共有2^n-1中可能。思路之后就断开了,如何存储数据,使用一维数组表示调整的次数,或者是使用二维数组,那么二维数组表示的是什么意思呢?带着这些疑问,我决定看一下别人的思路。
百度搜索到了解决问题的方法,涉及的陌生名词一共有3个。动态规划、滚动数组、记忆搜索。
建立一个二维数组M[A.size()][100],A.size()表示数组的大小,其中100表示0-99的100中可能。
M[i][j]表示的值的含义是第i个数据调整成j使用的最小调整次数,前面的i-1个数据已经最小的方式了。
m[i][j] = min{ m[i-1][k]+abs(A[i]-j)/0 //其中k的取值是j-target到j+target };
一共需要三次循环,最外层循环A.size()次,中间循环100次,第三次循环2*target次
#include
#include
#include
#include
#include
#include
using namespace std;
class Solution {
public:
{
return 0;
}
int ** m = new int* [A.size()];
for(int i = 0 ; i {
m[i] = new int[100];
}
for(int i = 0 ; i {
m[0][i] = abs(i-A.at(0));
}
int min;
int min_j;
for(int i = 1 ; i {
min_j = 100000;
for(int j = 0 ; j {
min = 100000;
//并不是全部位置可能只有一部分。
for(int z = -target ; z {
//如果相差的数据,在target之内,不需要修改数据
if(z+j = 100)
{
continue;
}
if(min > m[i-1][z+j] + abs(j-A.at(i)))
{
min = m[i-1][z+j] + abs(j-A.at(i));
}
}
m[i][j] = min;
if(m[i][j] {
min_j = m[i][j];
}
}
//最后的答案就是min;
return min_j;
}
};
int main()
{
vector
vec.push_back(1);
vec.push_back(100);
//vec.push_back(6);
cout return 0;
}
上一篇:人生苦短,我学PYTHON