您的位置:首页 > 其它

递推DP HDOJ 5375 Gray code

2015-08-12 10:39 369 查看
题目传送门

 /*
题意:给一个串,只能是0,1,?(0/1)。计算格雷码方法:当前值与前一个值异或,若为1,可以累加a[i],问最大累加值
DP:dp[i][0/1]表示当前第i位选择0/1时的最大分数,那么分类讨论,情况太多,看代码,注意不可能的状态不要转移
*/
/************************************************
* Author        :Running_Time
* Created Time  :2015-8-11 15:49:03
* File Name     :G.cpp
************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 2e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
char s[MAXN];
int a[MAXN];
int dp[MAXN][2];

int work(int n)    {
memset (dp, 0, sizeof (dp));
if (s[1] == '?')    dp[1][1] = a[1];
else    {
int t = s[1] - '0';
if (t == 1)    dp[1][1] = a[1];
}
for (int i=2; i<=n; ++i)    {
if (s[i] == '?')    {
if (s[i-1] == '?')    {
dp[i][0] = max (dp[i-1][0], dp[i-1][1] + a[i]);
dp[i][1] = max (dp[i-1][1], dp[i-1][0] + a[i]);
}
else    {
int t = s[i-1] - '0';
dp[i][1-t] = max (dp[i-1][1-t], dp[i-1][t] + a[i]);
dp[i][t] = dp[i-1][t];
}
}
else    {
if (s[i-1] == '?')    {
int t = s[i] - '0';
dp[i][t] = max (dp[i-1][t], dp[i-1][1-t] + a[i]);
}
else    {
int tt = s[i-1] - '0', t = s[i] - '0';
dp[i][t] = dp[i-1][tt] + ((tt != t) ? a[i] : 0);
}
}
}

if (s
== '?')    {
return max (dp
[0], dp
[1]);
}
else return dp
[s
-'0'];
}

int main(void)    {        //HDOJ 5375 Gray code
int T, cas = 0;    scanf ("%d", &T);
while (T--)    {
scanf ("%s", s + 1);
int len = strlen (s + 1);
for (int i=1; i<=len; ++i)    scanf ("%d", &a[i]);
printf ("Case #%d: %d\n", ++cas, work (len));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: