这个题目主要是思路要拓展,带问号的01串的最小权值实际上就是去除问号的子串的01或10的权值和,分析如下:
1.0?0或者1?1的情况,一定选择与两边相同的值权值最小,即000和111
2.0?1或1?0的情况,无论?选1或0最后都只含01或10子串,与删掉?情况相同
当然也可以对所有情况进行暴力搜索,也可得出问题的答案
#include <stdio.h>
#include <string.h>
#define N 10
void Remove(char *s,char c)//去除s中的问号
{
int i,k;
for(i=0;s[i]!='\0';i++)
{
if(s[i]==c)
{
for(k=i;s[k]!='\0';k++) {s[k]=s[k+1];}
i--;
}
else continue;
}
}
int Count(char *s,int w1,int w2)//计算不含问号的字符串的01和10权值
{
int cnt=0;
for(;*s;s++)
{
if(*s=='0' && *(s+1)=='1') cnt+=w1;
else if(*s=='1' && *(s+1)=='0') cnt+=w2;
}
return cnt;
}
int main()
{
int cases=0;
for(;cases<4;cases++)
{
int w1,w2;
char s[N+1];
scanf("%d%d%s",&w1,&w2,s);
Remove(s,'?');
printf("%s\n",s);
int ans=Count(s,w1,w2);
if(cases==3)printf("%d",ans);
else printf("%d\n",ans);
}
}