POJ 1579 Function Run Fun

题目链接地址: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;

}


你可能感兴趣的:(c,function,fun)