poj1579记忆和剪枝或动态规划dp

  1. #include <iostream>
    using namespace std;
  2. //***********************常量定义*****************************
  3. const int NUM = 22;
  4. //*********************自定义数据结构*************************
  5. //********************题目描述中的变量************************
  6. //**********************算法中的变量**************************
  7. int dp[NUM][NUM][NUM];
    bool visit[NUM][NUM][NUM];
  8. //***********************算法实现*****************************
    /*
    //记忆化搜索 递归形式的实现
    int RecSolve( int a, int b, int c )
    {
        if( a<=0 || b<=0 || c<=0 )
        {
            return 1;
        }
        if( a>20 || b>20 || c>20 )
        {
            return RecSolve( 20, 20, 20 );
        }
  9.     //先查找,看以前是否计算过
        if( visit[a][b][c] )
        {
            return dp[a][b][c];
        }
  10.     visit[a][b][c] = true;
        if( a<b && b<c )
        {
            return dp[a][b][c] = RecSolve(a, b, c-1) + RecSolve(a, b-1, c-1) - RecSolve(a, b-1, c);
        }
        else
        {
            return dp[a][b][c] = RecSolve(a-1, b, c) + RecSolve(a-1, b-1, c) + RecSolve(a-1, b, c-1) - RecSolve(a-1, b-1, c-1);
        }
    }
    */
    //DP实现
    int DPSolve( int a, int b, int c )
    {
        if( a<0 || b<0 || c<0 )
        {
            a = b = c = 0;
        }
        if( a>20 || b>20 || c>20 )
        {
            a = b = c = 20;
        }
  11.     //a ,b ,c可能为负,必须放在if( a<0 || b<0 || c<0 )之后
        if( visit[a][b][c] )
        {
            return dp[a][b][c];
        }
  12.     int x, y, z;
        for( z=0; z<=a; z++ )
        {
            for( x=0; x<=b; x++ )
            {
                for( y=0; y<=c; y++ )
                {
                    if( z==0 || x==0 || y==0 )
                    {
                        dp[z][x][y] = 1;
                    }
                    else if( z<x && x<y )
                    {
                        dp[z][x][y] = dp[z][x][y-1] + dp[z][x-1][y-1] - dp[z][x-1][y];
                    }
                    else
                    {
                        dp[z][x][y] = dp[z-1][x][y] + dp[z-1][x-1][y] + dp[z-1][x][y-1] - dp[z-1][x-1][y-1];
                    }
                    //visit是全局变量
                    //如果已经计算过,则设置标记
                    visit[z][x][y] = true;
                }
            }
        }
        return dp[a][b][c];
    }
  13. //************************main函数****************************
  14. int main()
    {
        //freopen( "in.txt", "r", stdin );
        memset( dp, 0, sizeof(dp) );
        memset( visit, false, sizeof(visit) );
  15.     int a, b, c;
        while( cin >> a >> b >> c, !( a == -1 && b == -1 && c == -1 ) )
        {
            int ans = DPSolve( a, b, c );
            cout << "w(" << a << ", " << b << ", " << c << ") = " << ans << endl;
        }
  16.     return 0;
    }
posted @ 2013-10-11 11:45  junxing  阅读(156)  评论(0)    收藏  举报