pku1579---Function Run Fun动态规划题:递归函数(会TLE)

本文介绍了一种三参数递归函数的优化方法,通过预计算所有可能的递归值并存储,避免了重复计算的问题。文章提供了具体的实现代码,展示了如何通过递推式计算递归函数的值。

题目大意:

Consider a three-parameter recursive function w(a, b, c):

if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns:
1

if a > 20 or b > 20 or c > 20, then w(a, b, c) returns:
w(20, 20, 20)

if a < b and b < c, then w(a, b, c) returns:
w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)

otherwise it returns:
w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)

如果直接用递归函数肯定会tle,到目前为止碰到两种解决方案:

1)先用暴力法列出数值表,找规律,或用数学方法推导,直接找到递推式。

2)在程序开始先算出所有题目要求的数值范围,并保存,在主程序里直接调用就行了。(对于某些递归不适用)。

愚见。。。。。。有时候我自己都表达不清楚,以后发现错误了再修改咯。

这样一来,题目就很简单了。用题目所给的递推式事先算好所有值。

代码如下:

 

ContractedBlock.gifExpandedBlockStart.gifCode
#include<stdio.h>
int a,b,c,m[22][22][22];
void init()
{
    
for(a=0;a<=20;a++)
        
for(b=0;b<=20;b++)
            
for(c=0;c<=20;c++)
                m[a][b][c]
=1;
    
for(a=1;a<=20;a++)
        
for(b=1;b<=20;b++)
            
for(c=1;c<=20;c++){
                
if(a < b && b < c)
                    m[a][b][c]
=m[a][b][c-1]+m[a][b-1][c-1]-m[a][b-1][c];
                
else
                    m[a][b][c]
=m[a-1][b][c]+m[a-1][b-1][c]+m[a-1][b][c-1]-m[a-1][b-1][c-1];
            }
}
int main()
{
    init();
    
while(scanf("%d %d %d",&a,&b,&c),a!=-1||b!=-1||c!=-1){
        
if(a <= 0 || b <= 0 || c <= 0)
            printf(
"w(%d, %d, %d) = %d\n",a,b,c,1);
        
else if(a > 20 || b > 20 || c > 20)
            printf(
"w(%d, %d, %d) = %d\n",a,b,c,m[20][20][20]);
        
else
            printf(
"w(%d, %d, %d) = %d\n",a,b,c,m[a][b][c]);
    }
}

转载于:https://www.cnblogs.com/pandy/archive/2009/01/07/1371472.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值