您的位置:首页 > 其它

hiho 有序01字符串 dp

2016-06-21 10:35 162 查看

题目1 : 有序01字符串

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

对于一个01字符串,你每次可以将一个0修改成1,或者将一个1修改成0。那么,你最少需要修改多少次才能把一个01串 S 变为有序01字符串(有序01字符串是指满足所有0在所有1之前的01串)呢?

输入

第一行是一个整数 T,代表测试数据的组数。(1 ≤ T ≤ 10)

以下T行每行包含一个01串 S 。(1 ≤ |S| ≤ 1000)

输出

对于每组测试数据输出最少需要修改的次数。

样例输入
3
000111
010001
100000

样例输出
0
1
1
思路:找到1的时候考虑是否改成0;
   min(1后面的字符串最小改变值+1,1后面的0的个数;


#include<bits/stdc++.h>
using namespace std;
#define ll __int64
#define mod 1000000007
#define pi (4*atan(1.0))
const int N=2e3+10,M=1e6+10,inf=1e9+10;
char a
;
int zero
,x;
int dp(char *a,int len)
{
if(len==0)
return 0;
for(int i=0;i<x;i++)
if(a[i]=='1')
return min(dp(a+i+1,len-i-1)+1,zero[x-len+i]);
return 0;
}
int main()
{
int y,z,i,t;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",a+1);
x=strlen(a+1);
memset(zero,0,sizeof(zero));
for(i=x;i>=1;i--)
if(a[i]=='0')
zero[i-1]=zero[i]+1;
else
zero[i-1]=zero[i];
printf("%d\n",dp(a+0,x));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: