gpt4 book ai didi

c++ - 将 C++ 函数转换为递归函数

转载 作者:行者123 更新时间:2023-11-28 04:04:29 24 4
gpt4 key购买 nike

我正在查看一个函数,需要将其转换为动态规划形式。但是我很难理解这个函数中使用的逻辑(基本情况是什么?),这个函数的原作者不再可以提问,我无法对他的工作做出正面或反面的判断,并且有0 个文档可用。

描述:

这个函数接受一个正整数矩阵,并找到最大和从矩阵的每一列中选择一个元素,从左到右移动。当你穿过矩阵逐列,根据您的方式,您的总和会受到惩罚相对于您之前的两个位置移动。如果您选择的下一行介于前两行之间选择行,没有惩罚;但是,上面每一行的总和都会受到 2 的惩罚前两项的最大值或低于前两项的最小值。

int calSum(int row, int cols, vector<vector<int>> inputArray, vector<int> *outputArray){

int ans[row][cols][row];
int index[row][cols][row];

int firstCol[row];

for(int i=0;i<row;i++){

firstCol[i]= inputArray[i][0] - 2*(i);
}

for(int i=0;i<row;i++){

for(int j=0;j<row;j++){
int penalty;

if(i<=j){
penalty=0;
}else{
penalty= 2* (i-j);
}

ans[i][1][j]= inputArray[i][1] - penalty+ firstCol[j];

}
}

for(int j=2;j<cols;j++){

for(int i=0;i<row;i++){


int nextRow= i;

for(int k=0;k<row;k++){

int currRow= k;
int ind=-1;
int maxVal= INT_MIN;
for(int l=0;l<row;l++){

int prevRow=l;
int max1= max(prevRow, currRow);
int min1= min(prevRow, currRow);

int penalty;
if(nextRow<=max1&&nextRow>= min1){
penalty=0;
}else if(nextRow>max1){
penalty= 2*(nextRow-max1);
}else{
penalty= 2*(min1-nextRow);
}

int val= -penalty+ inputArray[i][j] + ans[k][j-1][l];
if(val>maxVal){
maxVal=val;
ind=l;
}
}

ans[i][j][k]=maxVal;
index[i][j][k]=ind;

}

}

}

int max=INT_MIN;
int x=-1;
int y=-1;

for(int i=0;i<row;i++){

for(int j=0;j<row;j++){

if(ans[i][cols-1][j]>max){
max= ans[i][cols-1][j];
x=i;
y=i;
}

}
}

for(int j=cols-1;j>=2;j--) {

outputArray->push_back(x);
int temp=x;
x= y;
y= index[temp][j][y];
}

outputArray->push_back(x);
outputArray->push_back(y);

return max;

}

我已尝试跟踪代码并不断迷失在逻辑中。非常感谢对此功能的基本解释。

最佳答案

核心数据结构 ans 的工作原理如下:ans[i][j][k] 是从 (k, 0)(i, j)。 (注意这里使用 row,col 表示法来匹配程序中的表示法)

如果我们逐个循环遍历代码:

  • 第一个 for 循环计算第一列中值的分数,考虑到行 > 1 的所有内容都会受到惩罚。
  • 第二个 for 循环计算 ans[i][1][j],或到第二列的最大路径,给定起始行 j 和结束行 i。
  • 第三个 for 循环逐渐向右扩展 ans。对于每一列 j > 1,它通过找到一个最大化 (k, 0) 到 (l, j) 的 l 来填充 ans[i][j][k] -1) 到 (i, j)。第一部分可以看ans[k][j-1][l],最后一步根据题中给出的规则计算。

    此循环还将 l 的最佳选择写入 ind 数据结构中,因此您可以稍后重建最佳路径。

  • 第四个 for 循环简单地找到最大路径值并存储结束行。
  • 最后的 for 循环通过回溯 ind 数据结构中的步骤来重建路径。

关于c++ - 将 C++ 函数转换为递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58994124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com