题目简要:
Description
Input
Output
Sample Input
1 1 1 2 2 2
Sample Output
2 4
这道题其实就是输出相应的值就好了。
解题思路:
这道题一开始我认为很简单,所以就直接用了上面的公式,直接在子函数里完成计算,在主函数中输出。然而却一直超时,后来才从网上发现超时的解决方法(其实后来老师也讲了)就是将求出来的已知的数放到一个数组中,这样就可以减少很多次运算。于是我为了表达方便建立了一个三维数组。将求出来的数放到里面,经过这样的处理,果然通过了。
附代码:
#include <iostream>
using namespace std;
int d[21][21][21];
int answer(int a,int b,int c)
{
if(a<=0||b<=0||c<=0)
return 1;
else if(a>20||b>20||c>20)
{
if(d[20][20][20]==0)
d[20][20][20]=answer(20,20,20);
return d[20][20][20];
}
else if(a<b&&b<c)
{
if(d[a][b][c-1]==0)
d[a][b][c-1]=answer(a,b,c-1);
if(d[a][b-1][c-1]==0)
d[a][b-1][c-1]=answer(a,b-1,c-1);
if(d[a][b-1][c]==0)
d[a][b-1][c]=answer(a,b-1,c);
return d[a][b][c-1]+d[a][b-1][c-1]-d[a][b-1][c];
}
else
{
if( d[a-1][b][c]==0)
d[a-1][b][c]=answer(a-1,b,c);
if(d[a-1][b-1][c]==0)
d[a-1][b-1][c]=answer(a-1,b-1,c);
if(d[a-1][b][c-1]==0)
d[a-1][b][c-1]=answer(a-1,b,c-1);
if(d[a-1][b-1][c-1]==0)
d[a-1][b-1][c-1]=answer(a-1,b-1,c-1);
return d[a-1][b][c]+d[a-1][b-1][c]+d[a-1][b][c-1]-d[a-1][b-1][c-1];
}
}
int main()
{ int a,b,c;
while(cin>>a>>b>>c)
{
cout<<answer(a,b,c)<<endl;
}
return 0;
}
解题感受:
通过这道题,我掌握了一种如何减少运算量的方法,通过将已知量放入数组,可以避免很多重复计算,从而避免超时问题。要说到感受,就是自己还是应该打开思路。