HDU - 2476

思路:分解问题,先考虑从一个空串染色成 B串的最小花费 ,区间DP可以解决这个问题

具体的就是,当 str [ l ] = = str [ r ]时 dp [ L ] [ R ] = min (dp [ L + 1] [ R ],dp [ L ] [ R-1 ] )

其他情况可以选择任意一个断点 tmp = min ( tmp , dfs ( l  ,k ) + dfs ( k+1 , r ) );

接下来就是第二步 现在A串不是空串 ,但然把它当做空串去染是没有问题的,

但是现在有可能出现 A串有些部分与B串是相同的,所以会减少一些花费,定义 f 为到此为止由A转化为B的最小花费

那么我们就一个一个字符的来看,min ( f [ j ]  +   dp [ j ] [ i ] ) ( j < i ),当 A [ i ] = = B [ i ] 时多一个选择 f [ i - 1 ]   直接转移过来

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 123
int ans,len,f[maxn];
int dp[maxn][maxn],n;
char str[maxn],son[maxn];
int dfs(int l,int r)
{
if(l==r) dp[l][r]=1;
if(dp[l][r]!=-1)return dp[l][r];
int tmp=inf;
if(str[l]==str[r])
tmp=min(dfs(l,r-1),dfs(l+1,r));
else
for(int k=l; k<r; k++)
tmp=min(tmp,dfs(l,k)+dfs(k+1,r));
return dp[l][r]=tmp;
}
int main()
{
while(~scanf("%s%s",son,str))
{
memset(dp,-1,sizeof(dp));
int len=strlen(str);
dfs(0,len-1);
for(int i=0; i<len; i++)
{
f[i]=dp[0][i];
for(int j=0; j<i; j++)
f[i]=min(f[j]+dp[j+1][i],f[i]);
if(son[i]==str[i])
if(i==0)f[i]=0;
else f[i]=min(f[i],f[i-1]);
}
printf("%d\n",f[len-1]);
}
return 0;
}

  

String painter HDU - 2476 -区间DP的更多相关文章

  1. hdu 2476 (string painter) ( 字符串刷子 区间DP)

    String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. hdu 2476 区间dp

    题意: 给出两个串s1和s2,一次只能将一个区间刷一次,问最少几次能让s1=s2 例如zzzzzfzzzzz,长度为11,我们就将下标看做0~10 先将0~10刷一次,变成aaaaaaaaaaa 1~ ...

  3. HDU 2476 区间DP String painter

    题解 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm ...

  4. String painter (hdu 2476 DP好题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意: 给出两个等长的串S, T, 要将S变成T, 每次可以把S的连续的一段变成相同的字母 ...

  5. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  6. hdu 4283 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. HDU 4293---Groups(区间DP)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4293 Problem Description After the regional con ...

  8. HDU 4632 区间DP 取模

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4632 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字 ...

  9. hdu 4632(区间dp)

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...

随机推荐

  1. os.listdir()、os.walk()和os.mkdir()的用法

    内容主要参照博客https://blog.csdn.net/xxn_723911/article/details/78795033 http://www.runoob.com/python/os-wa ...

  2. hotplug/mdev机制

    目录 hotplug/mdev机制 框架 kobject_uevent_env mdev_main make_device mdev.conf 配置文件学习 更改属性 @:创建设备节点之后执行命令 $ ...

  3. NOI-OJ 1.13 ID:5 素数回文数的个数

    整体思路 使用埃拉拖色尼算法提前计算出1000以内的素数表. 设计一个回文判断函数isHW(int n),难点在于数字回文的判断.一个简单的方法是将数字n使用sprintf输出在一个数组中,然后从数组 ...

  4. DQL用户、权限管理(mysql8.0)

    DQL用户.权限管理(mysql8.0) 查看所有的用户: use mysql; -- 使用mysql数据库 select * from user; -- 查询user表中的全部信息,也就是用户 创建 ...

  5. DTO/DO等POJO对象的使用场景和 orika-mapper 框架的使用

    对于项目而言, 我们一般会有DAO->Service->Controller分层设计, 这些层次体现了每层的作用, 而层次之间的数据传递对象设计很少被提及, 下面是一个相对完整的数据转换过 ...

  6. [译]Ocelot - Tracing

    原文 Ocelot是使用的Butterfly这个项目来实现这个的. 在ocelot要使用tracing, 首先得安装相应的包: Install-Package Ocelot.Tracing.Butte ...

  7. python中的__len__,__getitem__ __setitem__ __delitem__ __contains__

    可变集合需要实现: __len__  __getitem__    __setitem__  __delitem__不可变集合需要实现: __len__  __getitem__ __len__:返回 ...

  8. Choreographer解析

    Choreographer_舞蹈编导 为什么叫舞蹈编导,因为舞蹈是由节奏的,节奏是每个点位动作的快慢控制,跳舞时节奏很重要,编舞者控制节奏.视图刷新也是如此,不是说你想刷就能刷,一切要按照底层信号要求 ...

  9. DQL、DML、DDL、DCL区别

    DQL(data query language)数据查询语言 主要是由SELECT构成的查询语句 基本语法:select 字段名 from 表名 where 查询条件 DML(data manipul ...

  10. Centos7.5 安装VirtualBox增强工具

    一.安装 1.自带tools:  选择VirtualBox工具栏 => 设备 => 安装增强功能 2.挂载光驱 3.进入光驱目录,执行(一定要用root权限执行) ①安装gcc yum i ...