您的位置:首页 > 其它

POJ 1579 Function Run Fun

2016-08-09 10:51 169 查看




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

解题思路:这道题是一道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!!!!!!!!!!!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: