HDU 5375 DP

模拟格雷码,给出格雷码每一位为1可得到的分数,然后给出一串二进制,之中‘?‘可为0或者1,求转换成格雷码的最大分数

二进制码→格雷码(编码)

此方法从对应的n位二进制码字中直接得到n位格雷码码字,步骤如下:

  1. 对n位二进制的码字,从右到左,以0到n-1编号
  2. 如果二进制码字的第i位和i+1位相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变)

然后DP求解每一位分别为1或者0的最大分数即可

#include "stdio.h"
#include "string.h"

const int inf=-0x7fffffff;
int a[200010];
char str[200010];
int dp[200010][2];
int Max(int a,int b)
{
    if (a<b) return b;
    else return a;
}

int main()
{
    int t,ii,i,len;
    scanf("%d",&t);
    for (ii=1;ii<=t;ii++)
    {
        scanf("%s",str);
        len=strlen(str);
        for (i=0;i<len;i++)
            scanf("%d",&a[i]);

        if (str[0]=='0')
        {
            dp[0][0]=0;
            dp[0][1]=inf;
        }
        if (str[0]=='1')
        {
            dp[0][0]=inf;
            dp[0][1]=a[0];
        }
        if (str[0]=='?')
        {
            dp[0][0]=0;
            dp[0][1]=a[0];
        }

        for (i=1;i<len;i++)
        {
            if (str[i]=='0')
            {
                dp[i][0]=dp[i-1][0];
                if (dp[i-1][1]!=inf) dp[i][0]=Max(dp[i][0],dp[i-1][1]+a[i]);
                dp[i][1]=inf;
            }
            if (str[i]=='1')
            {
                dp[i][1]=dp[i-1][1];
                if (dp[i-1][0]!=inf) dp[i][1]=Max(dp[i][1],dp[i-1][0]+a[i]);
                dp[i][0]=inf;
            }
            if (str[i]=='?')
            {
                dp[i][1]=dp[i-1][1];
                if (dp[i-1][0]!=inf) dp[i][1]=Max(dp[i][1],dp[i-1][0]+a[i]);
                dp[i][0]=dp[i-1][0];
                if (dp[i-1][1]!=inf) dp[i][0]=Max(dp[i][0],dp[i-1][1]+a[i]);
            }
        }

        printf("Case #%d: %d\n",ii,Max(dp[len-1][0],dp[len-1][1]));

    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 20:23:25

HDU 5375 DP的相关文章

hdu 5375 Gray code(DP)

hdu 5375 Gray code Problem Description The reflected binary code, also known as Gray code after Frank Gray, is a binary numeral system where two successive values differ in only onebit (binary digit). The reflected binary code was originally designed

HDU 5375(2015多校7)-Gray code(dp)

题目地址:HDU 5375 题意:给你一个二进制串,带'?'的位置可以由你来决定填'1'还是'0',补充完整之后转换成格雷码表示,每一个位置都有一个权值a[i],只有格雷码为'1'的位可以加上权值,问你最终权值之和最大为多少. 思路:首先要明白二进制码和格雷码是如何转换的: dp[i][0]表示第i位为0的时候的最大值,dp[i][1]表示第i位为1的时候的最大值.对于第i位的最大值由dp[i-1][0],dp[i-1][1]和当前权值a[i]得到.当前的位的二进制码有0,1,?三种情况,所以就

HDU 4832(DP+计数问题)

HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行,然后相乘累加起来就是答案 代码: #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long ll; const ll MOD = 9999991; const int N = 1005; int t, n, m, k, x, y; ll dp1

hdu 3944 dp?

DP? Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 128000/128000 K (Java/Others)Total Submission(s): 1804    Accepted Submission(s): 595 Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0,1,2,-a

hdu 5389 dp类似背包

http://acm.hdu.edu.cn/showproblem.php?pid=5389 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi (you may hear about ever17?) and developed by Chunsoft. Stilwell is enjoying the first chapter of this

hdu 1025 dp 最长上升子序列

1 //Accepted 4372 KB 140 ms 2 //dp 最长上升子序列 nlogn 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 const int imax_n = 500005; 8 int dp[imax_n]; 9 int d[imax_n]; 10 int a[imax_n]; 11 int n; 12 int len

HDU 5928 DP 凸包graham

给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也就是 dp[j][k]代表当前链末端为j,其内部点包括边界数量为k的最小长度.这样最后得到的一定是最优的凸包. 然后就是要注意要dp[j][k]的值不能超过L,每跑一次凸包,求个最大的点数量就好了. 和DP结合的计算几何题,主要考虑DP怎么搞 /** @Date : 2017-09-27 17:27

HDU 4901 DP背包

给你n个数,问你将数分成两个数组,S,T ,T 中所有元素的需要都比S任意一个大,问你S中所有元素进行 XOR 操作和 T 中所有元素进行 &操作值相等的情况有多少种. DP背包思路 dpa[i][j][0]  表示从左开始到i,不取i,状态为j的方案数 dpa[i][j][1]  表示从作开始到i,取i,状态为j的方案数 dpb[i][j]      表示从右开始到i,状态为j的方案数 因为S集合一定在T集合的左边,那么可以枚举集合的分割线,并且枚举出的方案要保证没有重复,如果要保证不重复,只

HDU 5375 Gray code (简单dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 626    Accepted Submission(s): 369 Problem Description The reflected binary cod