AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 200007
#define INF (1<<29)
using namespace std;
int dp[MAX][2];
int a[MAX];
int t,n;
char s[MAX];
int main ( )
{
scanf ( "%d" , &t );
int cc = 1;
while ( t-- )
{
scanf ( "%s" , s );
n = strlen(s);
for ( int i = 0 ; i < n ; i++ )
scanf ( "%d" , &a[i] );
if ( s[0] == '?' )
{
dp[0][1] = a[0];
dp[0][0] = 0;
}
if ( s[0] == '1' )
{
dp[0][1] = a[0];
dp[0][0] = -INF;
}
if ( s[0] == '0' )
{
dp[0][1] = -INF;
dp[0][0] = 0;
}
for ( int i = 1 ; i < n ; i++ )
{
if ( s[i] == '?' )
{
dp[i][1] = max ( dp[i-1][0] + a[i] , dp[i-1][1] );
dp[i][0] = max ( dp[i-1][1] + a[i] , dp[i-1][0] );
}
if ( s[i] == '1' )
{
dp[i][1] = max ( dp[i-1][0] + a[i] , dp[i-1][1] );
dp[i][0] = -INF;
}
if ( s[i] == '0' )
{
dp[i][1] = -INF;
dp[i][0] = max ( dp[i-1][1] + a[i] , dp[i-1][0] );
}
}
printf ( "Case #%d: " , cc++ );
printf ( "%d\n" , max ( dp[n-1][1] , dp[n-1][0] ));
}
}