dp[i][j]表示第i位取j的时候取得的最大的分数
然后分s[i]是不是问号,s[i-1]是不是问号这大的四种情况讨论
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 200005; 8 int dp[maxn][3]; 9 int a[maxn]; 10 char s[maxn]; 11 int n; 12 13 int main(){ 14 int T; 15 scanf("%d",&T); 16 int kase = 0; 17 while(T--){ 18 cin >> (s+1); 19 n = strlen(s+1); 20 for(int i = 1;i <= n;i++) scanf("%d",&a[i]); 21 22 s[0] = '0'; 23 memset(dp,0,sizeof(dp)); 24 25 for(int i = 1;i <= n;i++){ 26 if(s[i] == '?'){ 27 if(s[i-1] == '?'){ 28 dp[i][0] = max(dp[i-1][1] + a[i],dp[i-1][0]); 29 dp[i][1] = max(dp[i-1][0] + a[i],dp[i-1][1]); 30 } 31 else{ 32 if(s[i-1] == '0') dp[i][0] = dp[i-1][0],dp[i][1] = dp[i-1][0] + a[i]; 33 else dp[i][0] = dp[i-1][1] + a[i],dp[i][1] = dp[i-1][1]; 34 } 35 } 36 else{ 37 if(s[i-1] == '?'){ 38 if(s[i] == '0') dp[i][0] = max(dp[i-1][0],dp[i-1][1] + a[i]); 39 else dp[i][1] = max(dp[i-1][0] + a[i],dp[i-1][1]); 40 } 41 else{ 42 if(s[i] == s[i-1]) dp[i][s[i]-'0'] = dp[i-1][s[i-1]-'0']; 43 else dp[i][s[i]-'0'] = dp[i-1][s[i-1]-'0'] + a[i]; 44 } 45 } 46 // printf("dp[%d][0] = %d dp[%d][1] = %d ",i,dp[i][0],i,dp[i][1]); 47 } 48 printf("Case #%d: ",++kase); 49 if(s[n] == '?') printf("%d ",max(dp[n][0],dp[n][1])); 50 else printf("%d ",dp[n][s[n]-'0']); 51 } 52 return 0; 53 }
话说比赛的时候,题目的意思都没有读懂------
诶---
加油啊---goooooo---