POJ 1579 Function Run Fun

来源:互联网 发布:首届全球程序员节 编辑:程序博客网 时间:2024/06/10 10:59

这里写图片描述
这里写图片描述

题目大意:这道题要求题目上给的很明确也就没有什么多说的了。

解题思路:这道题是一道dp入门题,要用的记忆化搜索来做,不然很容易超时的。把计算出来的值记录上来,免得后面算过的值继续再算,这样超时是必然的。当然可以用递归来做,只是有个地方要优化下。

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <map>#include <cmath>#include <queue>using namespace std;int dp[20][20][20];int dps(int a,int b,int c){    if(a<=0||b<=0||c<=0)        return 1;    if(a>20||b>20||c>20)        return dps(20,20,20);    if(dp[a][b][c]!=0)//若dp数组当前值不为0 说明存在值 直接返回即可 这个不写上必然会超时的        return dp[a][b][c];    if(a<b&&b<c)        dp[a][b][c]=dps(a,b,c-1)+dps(a,b-1,c-1)-dps(a,b-1,c);    else        dp[a][b][c]=dps(a-1,b,c)+dps(a-1,b-1,c)+dps(a-1,b,c-1)-dps(a-1,b-1,c-1);    return dp[a][b][c];}int main(){    int a,b,c;    while(~scanf("%d %d %d",&a,&b,&c))    {        memset(dp,0,sizeof(dp));//初始化dp数组        if(a==-1&&b==-1&&c==-1)            break;        printf("w(%d, %d, %d) = %d\n",a,b,c,dps(a,b,c));    }    return 0;}

END!!!!!!!!!!!!!!!!!!!

1 0