华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1123|回复: 2
打印 上一主题 下一主题

P1464 Function

[复制链接]

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
跳转到指定楼层
楼主
发表于 2018-7-7 15:37:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1464

题目描述
对于一个递归函数 w(a,b,c)w(a,b,c)

如果 a \le 0a≤0 or b \le 0b≤0 or c \le 0c≤0 就返回值 11 .
如果 a>20a>20 or b>20b>20 or c>20c>20 就返回 w(20,20,20)w(20,20,20)
如果 a<ba<b 并且 b<cb<c 就返回 w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,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)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,b,ca,b,c 均为15时,调用的次数将非常的多。你要想个办法才行.

/* absi2011 : 比如 w(30,-1,0)w(30,−1,0) 既满足条件1又满足条件2

这种时候我们就按最上面的条件来算

所以答案为1

*/

输入输出格式
输入格式:
会有若干行。

并以 -1,-1,-1−1,−1,−1 结束。

保证输入的数在 [-9223372036854775808,9223372036854775807][−9223372036854775808,9223372036854775807] 之间,并且是整数。

输出格式:
输出若干行,每一行格式:

w(a, b, c) = ans

注意空格。

输入输出样例
输入样例#1:
1 1 1
2 2 2
-1 -1 -1
输出样例#1:
w(1, 1, 1) = 2
w(2, 2, 2) = 4
回复

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
推荐
 楼主| 发表于 2018-7-7 15:37:23 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. long long int x[10000],y[10000],z[10000];
  4. long long int p[200][200][200];
  5. int i,j;
  6. long long int w(long long int a,long long int b,long long int c)
  7. {
  8.     if(a<=0 || b<=0 || c<=0)return 1;
  9.     else if(a>20 || b>20 || c>20)return w(20,20,20);
  10.     if(p[a][b][c]!=0)return p[a][b][c];
  11.     if(a<b && b<c)
  12.     {
  13.         p[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
  14.         return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
  15.     }
  16.     else
  17.     {
  18.         p[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);
  19.         return(w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1));
  20.     }
  21. }
  22. int main()
  23. {
  24.     while(x[i]!=-1 || y[i]!=-1 || z[i]!=-1)
  25.     {
  26.         i++;
  27.         cin>>x[i]>>y[i]>>z[i];
  28.     }
  29.     for(j=1;j<i;j++)
  30.     cout<<"w("<<x[j]<<", "<<y[j]<<", "<<z[j]<<") = "<<w(x[j],y[j],z[j])<<endl;
  31.     return 0;
  32. }
复制代码
回复 支持 1 反对 0

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
板凳
发表于 2018-8-29 16:07:46 | 只看该作者
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int const maxn=23;
  5. long long f[maxn][maxn][maxn],a,b,c,t,k[100005];
  6. long long w(int a,int b,int c)
  7. {
  8.     if(a<=0||b<=0||c<=0)return 1;
  9.     else if(a>20||b>20||c>20)return w(20,20,20);
  10.     else if(a<b&&b<c)
  11.     {
  12.         if(f[a][b][c]==-1)f[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
  13.     }
  14.     else
  15.     {
  16.         if(f[a][b][c]==-1)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);
  17.     }
  18.     return f[a][b][c];
  19. }
  20. int main()
  21. {
  22.     cin>>a>>b>>c;
  23.     memset(f,-1,sizeof(f));
  24.     if(a==-1&&b==-1&&c==-1)return 0;
  25.     while(!(a==-1&&b==-1&&c==-1))
  26.     {
  27.         cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<w(a,b,c)<<endl;
  28.         cin>>a>>b>>c;
  29.     }
  30.     return 0;
  31. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 04:40 , Processed in 0.108774 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表