什么是郁闷?就是把整段代码从头至尾天翻地覆修改了一遍之后,发现错误出现在最不起眼的地方。今后出现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, 0xff, sizeof ( 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;
}
#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, 0xff, sizeof ( 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;
}