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}});
}