博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu5375 Gray code(DP)
阅读量:5167 次
发布时间:2019-06-13

本文共 1323 字,大约阅读时间需要 4 分钟。

题目链接:

题目大意:给你一个二进制串,带’?’的位置能够由你来决定填’1’还是’0’,补充完整之后转换成格雷码表示,每个位置都有一个权值a[i],仅仅有格雷码为’1’的位能够加上权值,问你终于权值之和最大为多少。 

格雷码表示能够百度一下,在这里能够通俗一点讲:对于这么一个串,假设i位置是1,那么他后面的数就会变化(0变1、1变0),注意仅仅是看初始串。

比如:初始串为110,那么改变以后则为101,而不是100。

思路:考虑用dp解决,dp[i][j]表示对于第i个位置取j时的最大分数(j取0或者1)。

那么就有dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]);

dp[i][1]=max(dp[i-1][0]+a[i],dp[i-1][1]);

当j为?时,表明j可能为0或者1。那么久两者都考虑处理一遍。

注意初始化。

#include
#include
#include
#define max(a,b) a>b?

a:b int dp[200005][2],a[200005]; int main() { int T,i,j,l,k,t=0; char s[200005],c[200005]; scanf("%d",&T); while(T--) { t++; scanf("%s",s); l=strlen(s); for(i=0;i<l;i++) c[i+1]=s[i]; for(i=1;i<=l;i++) scanf("%d",&a[i]); for(i=0;i<200005;i++) { dp[i][0]=-999999; dp[i][1]=-999999; } if(c[1]=='0')dp[1][0]=0; if(c[1]=='1')dp[1][1]=a[1]; if(c[1]=='?'){ dp[1][0]=0; dp[1][1]=a[1]; } for(i=2;i<=l;i++) { if(c[i]=='0'){ dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]); } if(c[i]=='1'){ dp[i][1]=max(dp[i-1][0]+a[i],dp[i-1][1]); } if(c[i]=='?

'){ dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]); dp[i][1]=max(dp[i-1][0]+a[i],dp[i-1][1]); } } printf("Case #%d: ",t); if(c[l]=='0')printf("%d\n",dp[l][0]); else if(c[l]=='1')printf("%d\n",dp[l][1]); else printf("%d\n",max(dp[l][0],dp[l][1])); } return 0; }

转载于:https://www.cnblogs.com/lytwajue/p/6895293.html

你可能感兴趣的文章
给一次重新选择的机会_您还会选择程序员吗?
查看>>
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
iOS开发 runtime实现原理以及实际开发中的应用
查看>>
BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)
查看>>
android 学习资源网址
查看>>
qt安装遇到的错误
查看>>
java:Apache Shiro 权限管理
查看>>
objective c的注释规范
查看>>
FreeNas安装配置使用
查看>>
Django(一)框架简介
查看>>
Python操作SQLite数据库的方法详解
查看>>
菜单和工具条(二)
查看>>
hadoop17---RPC和Socket的区别
查看>>
使用JMeter代理录制app测试脚本
查看>>
Linq to Object实现分页获取数据
查看>>
mac常用系统命令
查看>>
android上传文件到服务器
查看>>
我回答了90%的面试题,为什么还被拒?
查看>>