现在的位置: 首页 > 综合 > 正文

ZOJ 2852 Deck of Cards

2018年03月18日 ⁄ 综合 ⁄ 共 4137字 ⁄ 字号 评论关闭

什么是郁闷?就是把整段代码从头至尾天翻地覆修改了一遍之后,发现错误出现在最不起眼的地方。今后出现if...if...if...else的时候一定要小心,很可能就把原来的意思搞反了。

不难的DP题。方程是C[n,a,b,c] = max(C[n-1,a-v[i],b,c],C[n-1,a,b-v[i],c] ,C[n-1,a,b,c-v[i]]);,无非写起来要考虑清楚几种不同状况。

#include <cstdio>
#include 
<string>

int cards[101];
int maxScore[101][22][22][22];
int N;

int init ()
{
    scanf ( 
"%d"&N );
    
int i;
    
char cur;
    
for ( i = 0; i < N; i ++ )
    
{
        scanf ( 
"%1s"&cur );
        
if ( cur >= '2' && cur <= '9' )
            cards[i] 
= cur - '0';
        
else if ( cur == 'A' )
            cards[i] 
= 1;
        
else if ( cur == 'F' )
            cards[i] 
= 0;
        
else
            cards[i] 
= 10;
    }

    
return N;
}


void dp ()
{
    memset ( maxScore, 
0xffsizeof ( maxScore ) );
    
int i, a, b, c, _a, _b, _c;
    maxScore[
0][0][0][0= 0;
    
for ( i = 0; i < N; i ++ )
    
{
        
int flag = 0;
        
for ( a = 0; a < 22; a ++ )
        
{
            
for ( b = 0; b < 22; b ++ )
            
{
                
for ( c = 0; c < 22; c ++ )
                
{
                    
if ( maxScore[i][a][b][c] < 0 )
                        
continue;
                    
int t = maxScore[i][a][b][c];
                    
if ( !cards[i] ) // 大王
                    {
                        
if ( a != 21 && t + 150 > maxScore[i + 1][0][b][c] )
                            flag 
= 1, maxScore[i + 1][0][b][c] = t + 150;    
                        
if ( b != 21 && t + 250 > maxScore[i + 1][a][0][c] )
                            flag 
= 1, maxScore[i + 1][a][0][c] = t + 250;
                        
if ( c != 21 && t + 350 > maxScore[i + 1][a][b][0] )
                            flag 
= 1, maxScore[i + 1][a][b][0= t + 350;
                    }

                    
else
                    
{
                        _a 
= cards[i] + a, _b = cards[i] + b, _c = cards[i] + c;
                        
if ( _a == 21 )
                        
{
                            
if ( t + 150 > maxScore[i + 1][0][b][c] )
                                flag 
= 1, maxScore[i + 1][0][b][c] = t + 150;
                        }

                        
if ( _b == 21 )
                        
{
                            
if ( t + 250 > maxScore[i + 1][a][0][c] )
                                flag 
= 1, maxScore[i + 1][a][0][c] = t + 250;
                        }

                        
if ( _c == 21 )
                        
{
                            
if ( t + 350 > maxScore[i + 1][a][b][0] )
                                flag 
= 1, maxScore[i + 1][a][b][0= t + 350;
                        }

                        
if ( a != 21 && _a != 21 )
                        
{
                            
if ( _a > 21 )
                            
{
                                _a 
= 21;
                            }

                            
if ( t + 50 > maxScore[i + 1][_a][b][c] )
                                flag 
= 1, maxScore[i + 1][_a][b][c] = t + 50;
                        }

                        
if ( b != 21 && _b != 21 )
                        
{
                            
if ( _b > 21 )
                                _b 
= 21;
                            
if ( t + 50 > maxScore[i + 1][a][_b][c] )
                                flag 
= 1, maxScore[i + 1][a][_b][c] = t + 50;
                        }

                        
if ( c != 21 && _c != 21 )
                        
{
                            
if ( _c > 21 )
                                _c 
= 21;
                            
if ( t + 50 > maxScore[i + 1][a][b][_c] )
                                flag 
= 1, maxScore[i + 1][a][b][_c] = t + 50;
                        }

                    }

                }

            }

        }

        
if ( !flag )
            
break;
    }

    
//pt ();
    int ans = 0;
    
for ( a = 0; a < 22; a ++ )
    
{
        
for ( b = 0; b < 22; b ++ )
        
{
            
for ( c = 0; c < 22; c ++ )
            
{
                
if ( maxScore[i][a][b][c] > ans )
                    ans 
= maxScore[i][a][b][c];
            }

        }

    }

    printf ( 
"%d ", ans );
}


int main ()
{
    
//freopen ( "in.txt", "r", stdin );
    
//freopen ( "out.txt", "w", stdout );
    while ( init () )
    
{
        dp ();
    }

    
return 0;
}

 

 

抱歉!评论已关闭.