运用动态规划,不难推导,输入整数对(m,n)其返回值F(m,n)应该是m阶等差数列的第n项。m与n的作用完全对称,F(m,n)同样也是n阶等差数列的第m项。代码见下:
#include<iostream>
#include<vector>
using namespace std;
size_t F(size_t m, size_t n)
{
size_t m_ = max(m,n);
size_t n_ = min(m,n);
vector<size_t> v(n_+1,1);
for (size_t p = 1; p<=m_; ++p)
for (size_t q = 1; q<=n_; ++q)
v[q] += v[q-1];
return v.back();
}
int main(void)
{
size_t m,n;
while(cin>>m>>n)
cout<<F(m,n)<<endl;
}而事实上,F(m,n)构成了杨辉三角,故利用杨辉三角通项公式可知:
F(m,n) = (m+n)!/m!/n!
所以,也可直接使用阶乘函数进行运算。代码见下:
#include<iostream>
using namespace std;
size_t factorial( size_t n)
{
size_t p = 1;
for(size_t k=1; k<=n; ++k)
p*=k;
return p;
}
int main(void)
{
size_t m,n;
while(cin>>m>>n)
cout<< factorial(m+n)/factorial(m)/factorial(n)<<endl;
}


京公网安备 11010502036488号