很基础的一个记忆化搜索,但是还是出了点小问题,数组只开到了25.但是我居
然想记忆50的值,所以判断返回要从第三种情况开始,前面两种直接返回给定的值。
/* Accepted 236K 0MS C++ 717B 2012-04-11 09:39:09 */ #include<cstdio> #include<cstring> #include<cstdlib> int w[25][25][25]; 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); int &ans = w[a][b][c]; if( ans != -1) return ans; if( a < b && b < c) return ans = dfs( a, b, c - 1) + dfs( a, b - 1, c - 1) - dfs( a, b - 1, c); return ans = dfs( a - 1, b, c) + dfs(a - 1, b - 1, c) + dfs(a - 1, b, c - 1) - dfs( a - 1, b - 1, c - 1); } int main() { int a, b, c; memset( w, -1, sizeof w); while( scanf( "%d%d%d", &a, &b, &c) == 3) { if( a == -1 && b == -1 && c == -1) break; printf( "w(%d, %d, %d) = %d\n", a, b, c, dfs( a, b, c) ); } return 0; }