UVA 1371 Period

原创 2016年08月29日 15:31:44

题目链接:http://acm.hust.edu.cn/vjudge/problem/41549


题意:给两个串A,B。现在把B串分为若干个部分,对每一个部分进行操作将其变为一个A串,使得每部分操作次数的最大值最小。


思路:二分答案最大值x,然后用x去dp检测是否可行。

dp[i][j]为B的前i个字符,且B的第i个字符已经匹配到A串的第j个字符时的最小修改次数。

若dp[i-1][m]<=x,那么就可以作为一段的结束,从i开始去匹配A串的第一个字符。

dp[i][j] = min( dp[i][j] , dp[i][j-1] + 1 );  在i后面添加A串的第j个字符
dp[i][j] = min( dp[i][j] , dp[i-1][j] + 1 );  删除B串的第i个字符
dp[i][j] = min( dp[i][j] , dp[i-1][j-1] + (A[i]!=B[j]) );  修改B串第i个字符为A串第j个


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007

const int maxn = 5009;

char A[maxn],B[100];

int dp[maxn][55];
int La,Lb;

bool check( int k )
{
    Clean(dp,0x3f);

    dp[1][1] = A[1] != B[1];
    rep(j,2,Lb) dp[1][j] = min( dp[1][j-1] + 1 , j-1 + (A[1]!=B[j]) );

    rep(i,2,La)
    {
        if ( dp[i-1][Lb] <= k )
            dp[i][1] = A[i] != B[1];
        rep(j,1,Lb)
        {
            dp[i][j] = min( dp[i][j] , dp[i][j-1] + 1 );
            dp[i][j] = min( dp[i][j] , dp[i-1][j] + 1 );
            dp[i][j] = min( dp[i][j] , dp[i-1][j-1] + (A[i]!=B[j]) );
        }
    }
    return dp[La][Lb] <= k;
}

int main()
{
    int T;
    cin>>T;
    getchar();
    while(T--)
    {
        scanf("%s%s",B+1,A+1);
        La = strlen(A+1);
        Lb = strlen(B+1);
        int l = 0,r = 50;
        int mid;
        while( l < r )
        {
            mid = ( l + r )>> 1;
            if ( check( mid ) )
                r = mid;
            else l = mid + 1;
        }
        cout<<l<<endl;
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

JMeter之Ramp-up Period(in seconds)说明(可同时并发)

Ramp-up Period(in seconds) 【1】决定多长时间启动所有线程。如果使用10个线程,ramp-up period是100秒,那么JMeter用100秒使所有10个线程启动并运行...
  • sunwangdian
  • sunwangdian
  • 2016年02月25日 16:51
  • 21456

Java8 新日期时间类(3)

java.time 时间日期偏移类 java.time处理本地日期时间偏移的主要类为 java.time.Duration,java.time.Period ; Period - 处理有...
  • Al_assad
  • Al_assad
  • 2017年02月28日 19:49
  • 956

习题4-8 特别困的学生 UVa12108

#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #define N 1000000 int n...
  • u014800748
  • u014800748
  • 2014年08月06日 21:35
  • 1869

UVA-815 flooded!(白书说能锻炼思维的题)

题意挺长的,而且是英文的,我这里就简述一下吧,就是有m*n个格子,每个格子都是10*10的规格(高度是无限的),给出每个格子的海拔,然后给出一个洪水的量,输出最后水深度和完全被水覆盖的面积百分比。这个...
  • FishSeeker
  • FishSeeker
  • 2016年04月08日 09:36
  • 953

UVA 1658 - Admiral (拆点+最小费用流)

该题中的拆点法是解决几点容量的通用方法 。  因为只有容量限制的话仍然不能满足每个结点只访问一次这个限制 ,原因很简单,大家画个图就知道了,假设从起点有两条路到同一个结点2,然后又都到末点n,虽然它们...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2015年08月21日 20:53
  • 1093

uva 12174 - Shuffle(预处理+暴力)

题目链接:uva 12174 - Shuffle 题目大意:有一个播放器用于播放音乐,现在给出s(已有曲目的数量),n给出记录的长度。播放器有随机播放的功能,每次生成一个1~s的随机系列进行...
  • u011328934
  • u011328934
  • 2014年02月16日 19:05
  • 1495

Rails(UVa514)(栈)

Rails  There is a famous railway station in PopPush City. Country there is incredibly hilly. Th...
  • hdd871532887
  • hdd871532887
  • 2015年12月21日 07:13
  • 647

kafka学习笔记四:搭建Kafka集群

Kafka集群配置通常有三种,最简单的下面的第一种,也是默认的一种: 单节点,单Broker单节点,多Broker多节点,多Broker 版本选择: kafka_2.11-0.11.0.0....
  • see_you_see_me
  • see_you_see_me
  • 2017年11月09日 14:04
  • 103

如何设置适当的ramp-up period值

如何设置适当的ramp-up period值 如何设置适当的值并不轻易。        首先,假如要使用大量线程的话,ramp-up period 一般不要设置成零。 ...
  • huaweitman
  • huaweitman
  • 2018年01月04日 12:21
  • 26

例题10-2 不爽的裁判 UVa12169

1.题目描述:点击打开链接 2.解题思路:本题要求找到合适的一组a,b,使得按照递推公式能输出正确的x2,x4...可以枚举a值,通过列写方程得到b的值,但这里有一个问题,这里是一个同余方程,等号的...
  • u014800748
  • u014800748
  • 2015年02月20日 12:31
  • 888
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 1371 Period
举报原因:
原因补充:

(最多只允许输入30个字)