poj 1580

来源:互联网 发布:淘宝代销退货 编辑:程序博客网 时间:2024/06/04 00:59

     题目意思看不懂那是不太可能的了。不过递归会tle倒有点可疑,因为discuss那里还是有人用递归过了的。

     这是一道很简单的dp题,因为dp的方程已经给出并且状态转移方程也都写出了,所以根本没什么难度,就当作是认识一下dp吧,因为dp的形式有两种,一种是递推,另一种是递归,后者多用记忆化搜索来提高效率。

 

     以下是代码:

 

  1. #include<cstdio>
    using namespace std;
    const int M=25;
    int w[M][M][M];
    int a,b,c;
  2. void init()
    {
     int i,j,k;
     for(i=0;i<=20;i++)
     {
      for(j=0;j<=20;j++)
      {
       for(k=0;k<=20;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];
        }
      }
     }
    }
  3. int main()
    {
      init();
     while(scanf("%d%d%d",&a,&b,&c)==3)
     {
      if(a==-1 && b==-1 && c==-1) break;
      if(a<=0 || b<=0 || c<=0)
      {
       printf("w(%d, %d, %d) = %d/n",a,b,c,w[0][0][0]);
      }
      else if(a>20 || b>20 || c>20)
      {
       printf("w(%d, %d, %d) = %d/n",a,b,c,w[20][20][20]);
      }
      else
      {
       printf("w(%d, %d, %d) = %d/n",a,b,c,w[a][b][c]);
      }
     }
     return 0;
    }