cogs 1396. wwww

1396. wwww

☆   输入文件:wwww.in   输出文件:wwww.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

 

对于一个递归函数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、b、c的值会使函数运行时间无法忍受。

 

【输入格式】

输入文件有n+1(0<=n<=10000)行,第i(1<=i<=n)行有三个整数ai,bi,ci(保证在pascal的longint 或 C/C++的long范围内)。

第n+1行必定是-1 -1 -1(同时保证其他行不会是-1 -1 -1)。

【输出格式】

输出文件有n行,第i行输出w(ai,bi,ci)的值(保证在pascal的int64 或 C/C++的long long范围内)。

【样例输入】

 

 

 

【样例输出】

 

 

【提示】

输出的第一行是w(1,1,1),输出的第2行是w(2,2,2)。

【来源】

题目提供者邮箱:darkgodz@qq.com

(感谢题目提供者对COGS评测系统的支持)

思路:题目已经提示的很明显了,别忘了加上记忆化。

#include<cstdio>  
#include<cstring>  
#include<iostream>
#include<algorithm>
using namespace std;  
int a,b,c;
int f[30][30][30];  
int w(int a,int b,int c){  
      if(a<=0||b<=0||c<=0){ return 1; }  
      if(a>20||b>20||c>20){ return(w(20,20,20)); }  
      if(f[a][b][c]>0)    return(f[a][b][c]);
      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]); }  
      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(){
    freopen("wwww.in","r",stdin);  
    freopen("wwww.out","w",stdout);    
      while(scanf("%d%d%d",&a,&b,&c)){  
        if(a==-1&&b==-1&&c==-1)    return 0;
        printf("%d\n",w(a,b,c));  
      }    
}  

 

转载于:https://www.cnblogs.com/cangT-Tlan/p/7732064.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值