HDU 5375 Gray code(DP)
题意:给一串字符串,里面可能出现0,1,?,当中问号可能为0或1,将这个二进制转换为格雷码后,格雷码的每位有一个权值,当格雷码位取1时。加上该位权值,求最大权值和为多少。
分析:比赛的时候愚了。竟然以为格雷码是由3个二进制字符转换的,于是妥妥wa了,事实上格雷码的求法是通过异或求的的,即Gi=Bi⊕Bi-1(G为格雷码,B为二进制数),那么仅仅要水水的DP一下就好了。详细DP是通过保存
DP[i][j],当中i为当前位。j表示当前为为0还是1,递推式为:
一、s[i]为0时
1.s[i-1]为0,dp[i][0]=dp[i-1][0];
2.s[i-1]为1,dp[i][0]=dp[i-1][1]+v[i];
3.s[i-1]为?,dp[i][0]=max(dp[i-1][0],dp[i-1][1]+v[i]);
二、s[i]为1时
1.s[i-1]为0,dp[i][1]=dp[i-1][0]+v[i];
2.s[i-1]为1。dp[i][1]=dp[i-1][1];
3.s[i-1]为?,dp[i][1]=max(dp[i-1][0]+v[i],dp[i-1][1]);
三、s[i]为?时,就是结合上面两种情况
1.s[i-1]为0,dp[i][0]=dp[i-1][0],dp[i][1]=dp[i-1][0]+v[i];
2.s[i-1]为1,dp[i][0]=dp[i-1][1]+v[i],dp[i][1]=dp[i-1][1];
3.s[i-1]为?,dp[i][0]=max(dp[i-1][0],dp[i-1][1]+v[i]),dp[i][1]=max(dp[i-1][0]+v[i],dp[i-1][1]);
代码:
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #include <algorithm>
- #include<vector>
- #pragma comment(linker,"/STACK:1024000000,1024000000")
- using namespace std;
- const int maxn = 2e5+5;
- char s[maxn];
- int v[maxn];
- int dp[maxn][3];
- int main()
- {
- int t;
- scanf("%d",&t);
- for(int cas=1;cas<=t;cas++){
- memset(dp,0,sizeof(dp));
- scanf("%s",s+1);
- int n=strlen(s+1);
- s[0]='0';
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&v[i]);
- }
- for(int i=1;i<=n;i++)
- {
- if(s[i]=='1') {
- if(s[i-1]=='?')
- dp[i][1]=max(dp[i-1][0]+v[i],dp[i-1][1]);
- else if(s[i-1]=='0') dp[i][1]=dp[i-1][0]+v[i];
- else dp[i][1]=dp[i-1][1];
- }
- if(s[i]=='0') {
- if(s[i-1]=='?')
- dp[i][0]=max(dp[i-1][0],dp[i-1][1]+v[i]);
- else if(s[i-1]=='0') dp[i][0]=dp[i-1][0];
- else dp[i][0]=dp[i-1][1]+v[i];
- }
- if(s[i]=='?
- '){
- if(s[i-1]=='?'){
- dp[i][1]=max(dp[i-1][0]+v[i],dp[i-1][1]);
- dp[i][0]=max(dp[i-1][0],dp[i-1][1]+v[i]);
- }
- else if(s[i-1]=='0'){
- dp[i][1]=dp[i-1][0]+v[i];
- dp[i][0]=dp[i-1][0];
- }
- else{
- dp[i][1]=dp[i-1][1];
- dp[i][0]=dp[i-1][1]+v[i];
- }
- }
- }
- printf("Case #%d: %d\n",cas,max(dp[n][0],dp[n][1]));
- }
- }
HDU 5375 Gray code(DP)的更多相关文章
- hdu 5375 - Gray code(dp) 解题报告
Gray code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU 5375 Gray code (简单dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Oth ...
- HDU 5375——Gray code——————【dp||讨论】
Gray code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- hdu5375 Gray code(DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5375 题目大意:给你一个二进制串,带'?'的位置能够由你来决定填'1'还是'0',补充完整之后转换成 ...
- hdu 5375 Gray code 【 dp 】
dp[i][j]表示第i位取j的时候取得的最大的分数 然后分s[i]是不是问号,s[i-1]是不是问号这大的四种情况讨论 #include<cstdio> #include<cstr ...
- HDU 5375 Gray code 格雷码(水题)
题意:给一个二进制数(包含3种符号:'0' '1' '?' ,问号可随意 ),要求将其转成格雷码,给一个序列a,若转成的格雷码第i位为1,则得分+a[i].求填充问号使得得分最多. 思路:如果了 ...
- HDU 5791:Two(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=5791 Two Problem Description Alice gets two sequences A ...
- HDU 4833 Best Financing(DP)(2014年百度之星程序设计大赛 - 初赛(第二轮))
Problem Description 小A想通过合理投资银行理财产品达到收益最大化.已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dates[ ...
- 2015 Multi-University Training Contest 7 hdu 5375 Gray code
Gray code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
随机推荐
- neat算法——本质就是遗传算法用于神经网络的自动构建
基于NEAT算法的马里奥AI实现 所谓NEAT算法即通过增强拓扑的进化神经网络(Evolving Neural Networks through Augmenting Topologies),算法不同 ...
- EL中的param和params
转自:https://blog.csdn.net/javamoo/article/details/55667449 ${param.name}等价于request.getParameter(" ...
- <Sicily>Funny Game
一.题目描述 Two players, Singa and Suny, play, starting with two natural numbers. Singa, the first player ...
- 什么是Node.js?
Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适 ...
- Ubuntu 18.04 安装 Broadcom Limited BCM43142无线网卡驱动
系统默认没有集成 BCM43142无线网卡驱动可以通过下面的方法安装--------------------------------------------------------------root ...
- 错排公式 全排列函数 next_permitation(a,a+n)
不容易系列之一 错排:3件东西分别装进3个不同的特定的袋子,如果刚好一个都没有装对,就叫做错排! 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好“一件”事情尚且不易,若想永远 ...
- 用 while 循环做个小游戏
import random #可输入次数 flag = 0 #生成一个1到10之间的随机整数 res = random.randint(1,10) #判读三次输入机会 while(flag<3) ...
- 与 JSON 相关的一些操作 (项目中用到一部分,后续逐渐完善)
1.JSON 打印 console.log(JSON.stringify(data, null, 4)); 2.JSON 格式判断 var isjson = typeof(obj) == " ...
- Laravel+vue实现history模式URL可行方案
项目:laravel + vue 实现前后端分离.vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. h ...
- 怎么打开/查看MySQL的SQL记录
mysql在执行sql的时候会在日志当中记录很多信息,当然包括执行的所有语句.下面以使用navicat for mysql为例,来展示一下如何打开/查看MySQL的SQL记录: 打开navicat f ...