zoukankan      html  css  js  c++  java
  • Gray code---hdu5375(格雷码与二进制码,普通dp)

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

    题意就是:给你一串二进制码,里面可能含有'?'这个既可以表示0又可以表示1,

    让我们把这个二进制串转成格雷码串,转换之后的串中如果第 i 位为 1 那么就加上对应给出的a[i],求最大加的结果ans;

    例如:

    00?0

    1 2 4 8

    二进制串可以是      0000或者0010

    转化成格雷码之后是0000或者0011

    0000价值总和为0;

    0011的价值总和为a[3]+a[4]=12;

    dp[i][j]表示二进制第i位为j时的最大价值。同时应该注意初始化。

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    #define N 200020
    #define INF 0xfffffff
    
    int a[N], dp[N][2];
    char s[N];
    
    int main()
    {
        int T, n, t=1;
        scanf("%d", &T);
        while(T--)
        {
            memset(s, 0, sizeof(s));
            memset(a, 0, sizeof(a));
            memset(dp, 0, sizeof(dp));
            scanf("%s", s);
            n=strlen(s);
            for(int i=0; i<n; i++)
            {
                scanf("%d", &a[i]);
                dp[i][0] = dp[i][1] = -INF;
            }
            if(s[0]=='0' || s[0]=='?') dp[0][0] = 0;
            if(s[0]=='1' || s[0]=='?') dp[0][1] = a[0];
            for(int i=1; i<n; i++)
            {
                if(s[i]=='0' || s[i]=='?')
                    dp[i][0] = max(dp[i-1][0], dp[i-1][1]+a[i]);
                if(s[i]=='1' || s[i]=='?')
                    dp[i][1] = max(dp[i-1][1], dp[i-1][0]+a[i]);
            }
            int ans=max(dp[n-1][0], dp[n-1][1]);
            printf("Case #%d: %d
    ", t++, ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    多项式乘法
    容斥计算多重组合
    D. Tokitsukaze, CSL and Stone Game
    优惠买商品(dp、greedy)
    数星星(单点更新,求前缀和)
    信息推送(单点更新,求前缀和)
    互相送礼物
    Codeforces Round #611 (Div. 3)E. New Year Parties
    多源bfs
    mysql事务和锁
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4953659.html
Copyright © 2011-2022 走看看