一道有意思的题,高手进来看看.
whhif 2003-04-20 07:20:31 有这样的一个函数.
w(a,b,c)
当a<0或b<0或c<0时.
返回1
当a>20或b>20或c>20时
返回w(20,20,20)
当a<b且b<c时
返回w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
其它
返回w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
我们可能用递归来做题.
但是要花的时间会很多,比如a=15,b=15,c=15时.
现在我们要在3秒内做出答案.
每行输入三个数,用空格格开
最后以-1 -1 -1 结束输入.
1 1 1
2 2 2
10 4 6
50 50 50
-1 7 18
-1 -1 -1
输出以下列形式:
w(1, 1, 1) = 2
w(2, 2, 2) = 4
w(10, 4, 6) = 523
w(50, 50, 50) = 1048576
w(-1, 7, 18) = 1
-----------------------------------------------------------
以下是我的做法:
以空间来换取时间.
#include <iostream>
#include <vector>
class tri
{
public:
tri(int x,int y,int z):a(x),b(y),c(z){}
tri():a(0),b(0),c(0){}
int a,b,c;
};
using namespace std;
int main()
{
vector<tri> input;
vector<tri> ::iterator p;
tri temp;
vector<int> result;
int base[21][21][21];
for(int i=0;i<21;i++)
for(int j=0;j<21;j++)
for(int k=0;k<21;k++)
{
if(i==0||j==0||k==0)
base[i][j][k]=1;
else if(i<j&&j<k)
{
base[i][j][k]=base[i][j][k-1]+base[i][j-1][k-1]-base[i][j-1][k];
}
else
{
base[i][j][k]=base[i-1][j][k]+base[i-1][j-1][k]+base[i-1][j][k-1]-base[i-1][j-1][k-1];
}
}
int a,b,c;
while(true)
{
cin>>a;
cin>>b;
cin>>c;
if(a==-1&&b==-1&&c==-1)
{
break;
}
else
{
input.push_back(tri(a,b,c));
}
}
for(p=input.begin();p!=input.end();++p)
{
temp=*p;
if(temp.a<0)
{
temp.a=0;
}
if(temp.b<0)
{
temp.b=0;
}
if(temp.c<0)
{
temp.c=0;
}
if(temp.a>20)
{
temp.a=20;
temp.b=20;
temp.c=20;
}
result.push_back(base[temp.a][temp.b][temp.c]);
}
int size=input.size();
for(int i=0;i<size;i++)
{
cout<<"w("<<input[i].a<<", "<<input[i].b<<", "<<input[i].c<<" )"<<" = "<<result[i]<<endl;
}
return 0;
}
但我不知道还有什么情况我还没有考虑到.
请大家帮我想想,谢谢.