2474: 小明的灯

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:0 解决:0

题目描述

小明有 nn 盏灯,初始有些是开的,有些是关的,作为一个节约的孩子,他想关掉所有的灯。但是开关灯需要一些条件,他可以改变ii号灯的状态(将灯打开或将灯关闭)当且仅当 i+1i+1 是亮的且 i+2,i+3...ni+2,i+3...n 号灯是暗的,第 nn 盏灯可以随意开关

改变一盏灯的状态视为一次操作,小明想知道问将所有灯变暗最少需要多少次操作

输入

一行一个 0101 字符串,表示灯的状态,其中 11 表示灯是亮的, 00 表示灯是暗的

输出

一行一个数,表示最小需要的操作数

样例输入 复制

样例一:
11011

样例二:
1001

样例输出 复制

样例一:
18

样例二:
14

提示

对于 10\%10%的数据,输入全为00

另有 20\%20%的数据,输入只有第一个字符是11

另有 20\%20%的数据,输入全是11

另有 20\%20%的数据,n \leq 10n10

对于100\%100%的数据,保证n \leq 50n50

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int maxn=60;
char str[maxn];
bool a[maxn];
ll dp[maxn][2];
ll mi[maxn];
ll n;
void init()
{
	mi[0]=1;
	for(int i=1;i<=n;i++)
		mi[i]=mi[i-1]*2;	
}


int main()
{
	//freopen("light.in","r",stdin);
	//freopen("light.out","w",stdout);
	cin>>str;
	n=strlen(str);
	for(int i=0;i<n;i++)
		a[i+1]=str[i]-'0';
	dp[n][a[n]]=0,dp[n][!a[n]]=1;
	init();
//	print();
	for(int i=n-1;i>=1;i--)
	{
		dp[i][a[i]]=dp[i+1][0];
		dp[i][!a[i]]=dp[i+1][1]+mi[n-i];
	}
	printf("%lld",dp[1][0]);
	return 0;
}