Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实现';矢量化';这个重复的C++;密码?_C++_Algorithm_Vector_Stl - Fatal编程技术网

C++ 实现';矢量化';这个重复的C++;密码?

C++ 实现';矢量化';这个重复的C++;密码?,c++,algorithm,vector,stl,C++,Algorithm,Vector,Stl,我看到了挑战解决方案,我想知道是否有办法让它更有效和/或更美观。它计算一组数字的所有排列,其中有x4,y5,和z6。因此,代码变得相当重复: int cnt[101][101][101]; int solve1(int x,int y,int z){ if(x <= 0 && y <= 0 && z <= 0) return 1 ; int &ret = cnt[x][y][z] ; if(ret

我看到了挑战解决方案,我想知道是否有办法让它更有效和/或更美观。它计算一组数字的所有排列,其中有
x4
y5
,和
z6
。因此,代码变得相当重复:

int cnt[101][101][101];

int solve1(int x,int y,int z){
    if(x <= 0 && y <= 0 && z <= 0)
        return 1 ;
    int &ret = cnt[x][y][z] ;
    if(ret != -1) return ret ;
    ret = 0 ;
    if(x)
        ret += solve1(x-1,y,z) ;
    if(ret >= mod) ret -= mod ; 
    if(y)
        ret += solve1(x,y-1,z) ;
    if(ret >= mod) ret -= mod ; 
    if(z)
        ret += solve1(x,y,z-1) ;
    if(ret >= mod) ret -= mod ; 
    return ret ;
}
int-cnt[101][101];
整数解算1(整数x,整数y,整数z){
如果(x=mod)ret-=mod;
返回ret;
}
容器或算法是否提供了减少重复和/或提高效率的方法?

审议并驳回: 将
向量
传递给
solve()
而不是许多整数,然后使用
累积
收集
ret
修改每个向量元素(x、y、z作为向量元素)并调用原始向量输入的修改副本上的
solve
。 但这只是创建了一大堆向量,没有任何清晰的 平衡改进。另外,我还没有想出
acculate
应用程序,所以这部分可能太离谱了/不可能实现


感谢您的建议。

使用c++11,您可以替换:

if(x)
    ret += solve1(x-1,y,z) ;
if(ret >= mod) ret -= mod ; 
if(y)
    ret += solve1(x,y-1,z) ;
if(ret >= mod) ret -= mod ; 
if(z)
    ret += solve1(x,y,z-1) ;
if(ret >= mod) ret -= mod ; 
与:


您也可以只使用一个函数。

对x y z进行排序,这样记忆效果会更好:

int cnt[101][101][101]={0};
int solve1(std::array<int,3> idx){
  std::sort(idx.begin(),idx.end());
  int x=idx[0],y=idx[1],z=idx[2];

  if(x <= 0 && y <= 0 && z <= 0) return 1;
  int &ret = cnt[x][y][z];
  if(ret != -1) return ret;
  ret = 0;
  auto f=[&](int x,int y,int z){
    ret += solve1({{x-1,y,z}});
    if(ret >= mod) ret -= mod;
  };
  if(x)f(x-1,y,z);
  if(y)f(x,y-1,z);
  if(z)f(x,y,z-1);
  return ret;
}
int solve1(int x,int y,int z){
  return solve1({{x,y,z}});
}
intcnt[101][101][101]={0};
int solve1(std::array idx){
排序(idx.begin(),idx.end());
int x=idx[0],y=idx[1],z=idx[2];

如果(x),我没有检查代码。但是你描述的问题有一个封闭形式的解决方案。这是否足够有效和美观?@NicoSchertler,我当然想看看。你有问题的链接/名称吗?如果我理解正确,这是一个重复排列。排列的数量将是
(x+y+z)/(x!*y!*z!)
。这仍然需要一些思考来提高计算效率(而不必计算每个阶乘)。@NicoSchertler你是对的,我实际上知道这个公式。但我还有一个函数不能使用这个公式(添加置换的实际结果)这个问题仍然是对称的,上面的XYZ是对称的,所以在解决每一步之前,先把3个排序。应该更快,更少的浪费计算。Scott Meyers的C++ 11本书在我的待办事项清单上,但是我认为我的语言技能还没有准备好。非常感谢,这正是我所希望的。这是我不知道的。
int cnt[101][101][101]={0};
int solve1(std::array<int,3> idx){
  std::sort(idx.begin(),idx.end());
  int x=idx[0],y=idx[1],z=idx[2];

  if(x <= 0 && y <= 0 && z <= 0) return 1;
  int &ret = cnt[x][y][z];
  if(ret != -1) return ret;
  ret = 0;
  auto f=[&](int x,int y,int z){
    ret += solve1({{x-1,y,z}});
    if(ret >= mod) ret -= mod;
  };
  if(x)f(x-1,y,z);
  if(y)f(x,y-1,z);
  if(z)f(x,y,z-1);
  return ret;
}
int solve1(int x,int y,int z){
  return solve1({{x,y,z}});
}