poj 1579 Function Run Fun (记忆化搜索)
一直以为这道题是剪枝,没想到记忆化搜索会使时间变得这么短
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int a,b,c; int quick_pow(int a,int b) { int s=1; while(b>0) { if(b%2==1) s*=a; a=a*a; b=b>>1; } return s; } int dp[20][20][20]; int DFS(int a,int b,int c) { if(a<=0||b<=0||c<=0) return 1; if(a>20||b>20||c>20) return DFS(20,20,20); if(dp[a][b][c]) return dp[a][b][c]; if(a==b&&b==c) dp[a][b][c]=quick_pow(2,a);//这是之前剪枝的部分可删去 if(a<b&&b<c) dp[a][b][c]=DFS(a,b,c-1)+DFS(a,b-1,c-1)-DFS(a,b-1,c); else dp[a][b][c]=DFS(a-1,b,c)+DFS(a-1,b-1,c)+DFS(a-1,b,c-1)-DFS(a-1,b-1,c-1); return dp[a][b][c]; } int main() { while(cin>>a>>b>>c&&(a!=-1||b!=-1||c!=-1)) { memset(dp,0,sizeof(dp)); DFS(a,b,c); printf("w(%d, %d, %d) = %d\n",a,b,c,DFS(a,b,c)); } return 0; }