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
  • 相关阅读:
    hive函数总结
    python判断文件和目录是否存在
    python中的参数
    写hive db的两种方法
    python中argparse模块的使用
    python数据持久存储:pickle模块的使用
    python读文件
    mysql 将时间戳直接转换成日期时间
    shell日期的应用
    [转]SQL UNION 和 UNION ALL 操作符
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4953659.html
Copyright © 2011-2022 走看看