POJ 1579 Function Run Fun

来源:互联网 发布:软件培训 编辑:程序博客网 时间:2024/04/29 06:30

题目链接地址:http://poj.org/problem?id=1579

分析:

 

最简单的递归。但如果只写简单的递归,那么将会运行上几个小时会TLE

 

简单的递归函数:

long 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(a<b && b<c){               return w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);       }       else{               return w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);       } }

解决办法:开一个三维数组,从w(0,0,0)开始递推,逐步产生到w(20,20,20)的值,复杂度O(n^3).

     for(int i=0;i<21;i++){                     for(int j=0;j<21;j++){                            for(int k=0;k<21;k++){                                   if(i==0||j==0||k==0)                                          w[i][j][k] = 1;                                   else{                                          if(i<j&&j<k)                                                 w[i][j][k] = w[i][j][k-1] + w[i][j-1][k-1] - w[i][j-1][k];                                          else                                                 w[i][j][k] = w[i-1][j][k] + w[i-1][j-1][k] + w[i-1][j][k-1] - w[i-1][j-1][k-1];                                   }                            }                     }              }

源代码:

#include <iostream>using namespace std;int main(){        int w[21][21][21];       int a,b,c;       long result;        for(int i=0;i<21;i++){                     for(int j=0;j<21;j++){                            for(int k=0;k<21;k++){                                   if(i==0||j==0||k==0)                                          w[i][j][k] = 1;                                   else{                                          if(i<j&&j<k)                                                 w[i][j][k] = w[i][j][k-1] + w[i][j-1][k-1] - w[i][j-1][k];                                          else                                                 w[i][j][k] = w[i-1][j][k] + w[i-1][j-1][k] + w[i-1][j][k-1] - w[i-1][j-1][k-1];                                   }                            }                     }              }       while(cin>>a>>b>>c){              result=0;              if(a==-1 &&b==-1 &&c==-1){                     break;              }              if(a<=0 || b<=0 || c<=0){                     result=1;               }              else{                     if(a>20 || b>20 || c>20){                            result=w[20][20][20];                     }                     else{                            result=w[a][b][c];                     }              }              printf("w(%d, %d, %d) = %ld\n",a,b,c,result);       }       return 0;}