p2648_dp.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 61 行

CPP
61
字号
#include <iostream>

using namespace std;

long long f [11] [320] [6] , Ans [320];

void prepare ();

main ()
{
     int     N;
     prepare ();
     while ( cin >> N ) cout << Ans [N] << endl;
}

void prepare ()
{
     int     i , j , k , s , a , b , S1 , S2 , NextScore , NextState;
     memset ( f , 0 , sizeof ( f ));
     f [0] [0] [0] = 1;
     
     for ( i = 0; i < 10; i ++ )
         for ( j = 0; j < 300; j ++ )
             for ( s = 0; s < 6; s ++ ) if ( f [i] [j] [s] ) {
                 S1 = s / 3 , S2 = s % 3;
                 for ( a = 0; a <= 10; a ++ )
                     for ( b = 0; a + b <= 10; b ++ ) {
                         if ( a == 10 ) {
                              NextScore = j + a;
                              if ( S1 ) NextScore += a;
                              if ( S2 ) NextScore += a;
                              NextState = ( S2 > 1 ) * 3 + 2;
                              f [i + 1] [NextScore] [NextState] += f [i] [j] [s];
                         } else {
                              NextScore = j + a + b;
                              if ( S1 ) NextScore += a;
                              if ( S2 ) NextScore += a;
                              if ( S2 > 1 ) NextScore += b;
                              NextState = ( a + b == 10 );
                              f [i + 1] [NextScore] [NextState] += f [i] [j] [s];
                         }
                     }
             }
     for ( i = 0; i <= 300; i ++ ) Ans [i] = f [10] [i] [0];
     
     for ( i = 0; i <= 300; i ++ )
         for ( s = 1; s < 6; s ++ ) if ( f [10] [i] [s] ) {
             S1 = s / 3 , S2 = s % 3;
             for ( a = 0; a <= 10; a ++ )
                 for ( b = 0; b <= 10; b ++ ) {
                     if ( a != 10 && a + b > 10 ) continue;
                     if ( S2 < 2 && b ) continue;
                     NextScore = i;
                     if ( S1 ) NextScore += a;
                     if ( S2 ) NextScore += a;
                     if ( S2 > 1 ) NextScore += b;
                     Ans [NextScore] += f [10] [i] [s];
                 }
         }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?