我们看到这道题后,心中肯定会不由得发出一阵狂喜,这不就是一个简简单单的函数吗(当然不是,因为这道题异常的坑)?
然后呢,他"所谓的""AC"代码就出来了:
#include<bits/stdc++.h>
using namespace std;
int f[25][25][25];
int w(int a,int b,int c)
{
if(a<1||b<1||c<1)
return 1;
else if(a>20||a>20||c>20)
{
f[a][b][c]=w(20,20,20);
return f[a][b][c];
}
else if(f[a][b][c]!=0)
return f[a][b][c];
else if(a<b&&b<c)
{
f[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
return f[a][b][c];
}
else
{
f[a][b][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);
return f[a][b][c];
}
}
int main()
{
int n,m,k;
while(1)
{
cin>>n>>m>>k;
if(n==-1&&m==-1&&k==-1)
return 0;
cout<<w(n,m,k)<<"\n";
}
return 0;
30分,为什么呢,因为这道题要用记忆化:
所以,代码变成这样:
#include<bits/stdc++.h>
using namespace std;
int f[25][25][25]={0};
int w(int a,int b,int c)
{
if(a<1||b<1||c<1)
return 1;
else if(a>20||b>20||c>20)
{
f[20][20][20]=w(20,20,20);
return f[20][20][20];
}
else if(f[a][b][c]!=0)
return f[a][b][c];
else if(a<b&&b<c)
{
f[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
return f[a][b][c];
}
else
{
f[a][b][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);
return f[a][b][c];
}
}
int main()
{
int n,m,k;
while(1)
{
cin>>n>>m>>k;
if(n==-1&&m==-1&&k==-1)
return 0;
cout<<w(n,m,k)<<"\n";
}
return 0;
}
100分!结束……
这一篇短小的文章,可以反映出一个问题:
我们在正式比赛的时候一定要采取最保险的办法,不然就会白白丢分(少了整整70分啊!)。