Hdu 5375 Gray code

来源:互联网 发布:java词典 编辑:程序博客网 时间:2024/06/06 00:59

     纪念一下比赛中第一个出的dp,虽然写的代码并不怎么好,还要加栈。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375

     大致题意:给出一段“普通的二进制码”要求转换成“Gray码”每个字母(0或1)对应一个rank,如果对应值是1则可取到,反之则不可取到。求整个二进制码转换成Gray码后的总rank值,两个码之间怎么转换下边有定义,我就不再班门弄斧了:http://baike.baidu.com/view/358724.htm

     我写的记忆化搜索如下,应该许多大牛们写的都是递推式了

#pragma comment(linker,"/STACK:1024000000,1024000000")//手工加栈#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 300000using namespace std;int len;char s[MAXN];int r[MAXN];long long dp[MAXN][3];long long dfs(int now,int tmp){    int ans;    int c;    if(now==-1) c=0;    else c=tmp;    if(now==len-2)    {        int x=len-1;        if(s[x]=='?')            ans=max((c^0)*r[x],(c^1)*r[x]);        else        {            int ta=s[x]-'0';            ans=(c^ta)*r[x];        }    }    else if(dp[now+1][c]!=-1) ans=dp[now+1][c];    else    {        if(s[now+1]=='?')        {            ans=max(dfs(now+1,0)+((c^0)*r[now+1]),dfs(now+1,1)+((c^1)*r[now+1]));        }        else        {            int nex=s[now+1]-'0';            ans=dfs(now+1,nex)+((nex^c)*r[now+1]);        }    }    dp[now+1][c]=ans;    return ans;}int main(){    int T,times=1;    scanf("%d",&T);    while(T--)    {        memset(dp,-1,sizeof(dp));        scanf(" %s",s);        len=strlen(s);        for(int i=0;i<len;i++)            scanf("%d",&r[i]);        long long ans;        if(len%2) ans=dfs(-1,0);        else        {            if(s[0]=='?') ans=max(dfs(0,0),dfs(0,1)+r[0]);            else            {                int f=s[0]-'0';                if(f) ans=dfs(0,f)+r[0];                else ans=dfs(0,f);            }        }        if(ans==-1) ans=0;        printf("Case #%d: %I64d\n",times++,ans);    }    return 0;}


0 0
原创粉丝点击