C++ 在动态编程中如何在我的映射中存储递归值

C++ 在动态编程中如何在我的映射中存储递归值,c++,c++11,dynamic-programming,C++,C++11,Dynamic Programming,我试图通过动态编程找到从左上角网格到右下角网格的多种方式,因此我使用map进行记忆 当我尝试在映射中插入k值时,它不会存储在映射中,只存储我的c和r整数。为什么会这样 #include <iostream> #include <bits/stdc++.h> #include <algorithm> #include <stdbool.h> #include <map> using namespace std; int grid(int

我试图通过动态编程找到从左上角网格到右下角网格的多种方式,因此我使用
map
进行记忆

当我尝试在映射中插入k值时,它不会存储在映射中,只存储我的
c
r
整数。为什么会这样

#include <iostream>
#include <bits/stdc++.h>
#include <algorithm>
#include <stdbool.h>
#include <map>
using namespace std;
int grid(int r , int c , map<pair<int,int> ,int>& m1);
int main()
{
    map<pair<int ,int>,int> m1;
    int k=grid(2,3 ,m1);
    cout<<k<<endl;
    for(auto& it1:m1){
        cout<<it1.first.first<<"\t"<<it1.first.second<<"\t"<<it1.second<<endl;
    }
}

int grid(int r , int c , map<pair<int,int> ,int>& m1)
{
    if(r==0 || c==0) return 0;
    if(r==1 && c==1) return 1;
    if(m1[{r,c}]!=NULL){return m1[{r,c}];}
    int k=grid(r-1,c,m1)+grid(r,c-1,m1);
    m1.insert({{r,c},k});
    cout<<"k:"<<k<<endl;
    return grid(r-1,c,m1)+grid(r,c-1,m1);
}

使用
m1[{r,c}]
检查映射中的值的方法将创建不存在的条目。稍后尝试使用
m1.insert
添加密钥时,将不会添加该值,因为该密钥已存在

您可以将插入件替换为

m1[{r,c}] = k;
或者使用
查找
下限
检查该键是否存在。这还有一个优点,就是不需要对同一个密钥进行多次查找

auto it = m1.lower_bound({r,c});
if (it != m1.end) return it->second;  // key found, return value
int k = ...;
m1.insert(it, {{r,c}, v});

使用的提示版本可以利用以前不成功的查找来避免遍历映射以找到插入它的正确位置。

请参阅,如果(m1.find({r,c})!=m1.end(){return m1[{r,c}];}正确测试的是键
{r,c},则还应更改为
if(m1.find({r,c})!=m1.end()
已存在,而不是使用
NULL