很显然,题目中已经给出了递归函数,不过子问题较多,需要储存中间状态,因为是三个参数,所以是三维的DP,这样来说就很好理解了.
#include<stdio.h> #include<stdlib.h> int opt[21][21][21]; int w(int a,int b,int c) { if( a <= 0 || b <= 0 || c <= 0) return 1; if( a > 20 || b > 20 || c > 20) return w(20,20,20); if( opt[a][b][c] != -1) return opt[a][b][c]; else { if( a<b && b<c) return opt[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c); else return opt[a][b][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); } } int main(void) { int a,b,c; memset(opt,-1,sizeof(opt)); while(scanf("%d%d%d",&a,&b,&c)) { if(a==-1&&b==-1&&c==-1) break; printf("w(%d, %d, %d) = %d/n",a,b,c,w(a,b,c)); } return 0; }