C++前缀和算法:合并石头的最低成本原理、源码及测试用例(二)

简介: C++前缀和算法:合并石头的最低成本原理、源码及测试用例

旧版代码

template<class T>
 void MinSelf(T* seft, const T& other)
 {
   *seft = min(*seft, other);
 }
class Solution {
 public:
   int mergeStones(vector<int>& stones, int k) {
     m_k = k;
     m_c = stones.size();
     m_dp.assign(m_c + 1, vector<vector<int>>(m_c, vector<int>(k + 1, 1000 * 1000 * 100)));
     vector<int> vPreSum(1);
     for (const auto& stone : stones)
     {
       vPreSum.push_back(vPreSum.back() + stone);
     }
     for (int pos = 0; pos + 1 - 1 < m_c; pos++)
     {
       m_dp[1][pos][1] = 0;
     }
     for (int len = 2; len <= m_c; len++)
     {
       for (int pos = 0; pos+len <= m_c; pos++)
       {
         //int iEnd = pos + len - 1;
         for (int iHeapNum = 2; iHeapNum <= k; iHeapNum++)
         {
           for (int iPreLen = 1; iPreLen < len; iPreLen += k - 1)
           {
             MinSelf(&m_dp[len][pos][iHeapNum], m_dp[iPreLen][pos][1] + m_dp[len - iPreLen][pos + iPreLen][iHeapNum - 1]);
           }
         }
         m_dp[len][pos][1] = m_dp[len][pos][k] + vPreSum[pos + len] - vPreSum[pos];
       }      
     }    
     return (m_dp[m_c][0][1] >= 1000 * 1000 * 100) ? -1 : m_dp[m_c][0][1];
   }
   int m_k;
   int m_c;
   vector<vector<vector<int>>> m_dp;
 };

旧版代码2

template<class T>
 void MinSelf(T* seft, const T& other)
 {
   *seft = min(*seft, other);
 }
 class Solution {
 public:
   int mergeStones(vector<int>& stones, int k) {
     m_k = k;
     m_c = stones.size();
     m_dp.assign(m_c + 1, vector<int>(m_c, ( 1000 * 1000 * 100)));
     if ((m_c-1) % (k - 1) != 0)
     {
       return -1;
     }
     vector<int> vPreSum(1);
     for (const auto& stone : stones)
     {
       vPreSum.push_back(vPreSum.back() + stone);
     }
     for (int pos = 0; pos + 1 - 1 < m_c; pos++)
     {
       m_dp[1][pos] = 0;
     }
     for (int len = 2; len <= m_c; len++)
     {
       for (int pos = 0; pos+len <= m_c; pos++)
       {
         for (int iPreLen = 1; iPreLen < len; iPreLen += k - 1)
         {
           MinSelf(&m_dp[len][pos], m_dp[iPreLen][pos] + m_dp[len - iPreLen][pos + iPreLen]);
         }
         if ((len-1) % (k - 1) == 0)
         {
           m_dp[len][pos] +=  vPreSum[pos + len] - vPreSum[pos];
         }
       }      
     }    
     return (m_dp[m_c][0] >= 1000 * 1000 * 100) ? -1 : m_dp[m_c][0];
   }
   int m_k;
   int m_c;
   vector<vector<int>> m_dp;
 };

旧版代码三

class Solution {
public:
int mergeStones(vector& stones, int k) {
m_c = stones.size();
if (0 != (m_c - 1) % (k-1))
{
return -1;
}
vector vPreSum(1);
for (const auto& n : stones)
{
vPreSum.emplace_back(vPreSum.back() + n);
}
vector<vector> vLenBegin(m_c + 1, vector(m_c));
for (int len = k; len <= m_c; len++)
{
for (int begin = 0; begin + len - 1 < m_c; begin++)
{
int iMaxPreScore = INT_MAX;
for (int lLen = 1; lLen < len; lLen += (k - 1))
{
int rLen = len - lLen;
iMaxPreScore = min(iMaxPreScore, vLenBegin[lLen][begin] + vLenBegin[rLen][begin + lLen]);
}
if (0 == (len - 1) % (k - 1))
{
iMaxPreScore += vPreSum[begin + len] - vPreSum[begin];
}
vLenBegin[len][begin] = iMaxPreScore ;
}
}
return vLenBegin.back().front();
}
int m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。

https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程

https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版

https://download.csdn.net/download/he_zhidan/88348653

鄙人想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
墨家名称的来源:有所得以墨记之。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境:

VS2022 C++17

相关文章
|
19天前
|
大数据 C++ 索引
C++ STL标准库 《vector向量原理与实战分析》
C++ STL标准库 《vector向量原理与实战分析》
19 0
|
20天前
|
存储 自然语言处理 安全
C++ STL标准库 《string原理与实战分析》
C++ STL标准库 《string原理与实战分析》
20 0
|
20天前
|
C++ 容器
C++ STL标准库 《queue单向队列原理与实战分析》
C++ STL标准库 《queue单向队列原理与实战分析》
18 0
|
2月前
|
算法 C++
c++算法学习笔记 (5)前缀和+差分
c++算法学习笔记 (5)前缀和+差分
|
2月前
|
编译器 C++ 容器
C++模板的原理及使用
C++模板的原理及使用
|
2月前
|
设计模式 算法 C++
【C++】STL之迭代器介绍、原理、失效
【C++】STL之迭代器介绍、原理、失效
50 2
|
1天前
|
算法 索引
基于Prony算法的系统参数辨识matlab仿真
Prony算法在MATLAB2022a中用于信号分析,识别复指数信号成分。核心程序通过模拟信号X1,添加不同SNR的噪声,应用Prony方法处理并计算误差。算法基于离散序列的复指数叠加模型,通过构建矩阵并解线性方程组估计参数,实现LTI系统动态特性的辨识。
|
2天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。
|
2天前
|
算法
基于PSO粒子群优化的PID控制器参数整定算法matlab仿真
该文探讨了使用PSO(粒子群优化)算法优化PID控制器参数的方法。通过PSO迭代,不断调整PID控制器的Kp、Ki、Kd增益,以减小控制误差。文中提供了MATLAB2022a版本的核心代码,展示了参数优化过程及结果。系统仿真图像显示了参数随迭代优化的变化。PID控制器结合PSO算法能有效提升控制性能,适用于复杂系统的参数整定,未来研究可关注算法效率提升和应对不确定性。
|
3天前
|
算法
m基于GA遗传优化的高斯白噪声信道SNR估计算法matlab仿真
**MATLAB2022a模拟展示了遗传算法在AWGN信道中估计SNR的效能。该算法利用生物进化原理全局寻优,解决通信系统中复杂环境下的SNR估计问题。核心代码执行多代选择、重组和突变操作,逐步优化SNR估计。结果以图形形式对比了真实SNR与估计值,并显示了均方根误差(RMSE),体现了算法的准确性。**
10 0