桐桐的递归函数【DP(或DFS)】

>Description
桐桐经常找一些很有趣的数学书来阅读以增长自己的数学知识。一天,他偶然发现一个递归函数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)。
请编程求出这个递归函数的值。


>Input
a,b,c三个整数。(-50≤a,b,c≤50)

>Output
a,b,c三个整数所对应的w(a,b,c)函数的值。要求以w(a,b,c)=函数的值来输出。


>Sample Input
1 1 1

>Sample Output
w(1,1,1)=2


>解题思路
一开始是用DFS做的,后来发现可以用DP做,就不用这么麻烦了(DFS要记忆化搜索,标记)
DP和DFS都是直接根据题意打代码就行了。


>代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int aa,bb,cc,as,bs,cs,f[25][25][25];
int main()
{
	scanf("%d%d%d",&as,&bs,&cs);
	aa=min(max(as,0),20); bb=min(max(bs,0),20); cc=min(max(cs,0),20); //大于20取20,小于0取0
	for(int a=0;a<=aa;a++)
	 for(int b=0;b<=bb;b++)
	  for(int c=0;c<=cc;c++)
	  {
	  	if(a==0||b==0||c==0) f[a][b][c]=1;
	  	else if(a<b&&b<c) f[a][b][c]=f[a][b][c-1]+f[a][b-1][c-1]-f[a][b-1][c];
	  	else f[a][b][c]=f[a-1][b][c]+f[a-1][b-1][c]+f[a-1][b][c-1]-f[a-1][b-1][c-1];
	  }
	printf("w(%d,%d,%d)=%d",as,bs,cs,f[aa][bb][cc]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/92093100
今日推荐