字符刷子
来源:互联网 发布:前端页面如何优化 编辑:程序博客网 时间:2024/04/27 23:46
题目描述:略
题目分析:
关键字:DP,区间操作
我们从左边依次涂过去,若它的颜色与目标字符串不同,那么这个字符就一定要涂色,但此时的决策是把它向后涂多长(其实这里有个剪枝,只有后面的某个字符与现在要涂的颜色相同,涂到这里才是有意义的,读者自己领会)
当我们涂到后面的某个字符时,问题就分割成了一段都是相同颜色的,另一部分和原问题求的一样,最少涂多少次达到,发现了重复子问题,接下来就是DP。
可以定义dp[i][j][k]问满足【L,R】区间内都是k字符变成目标字符的最少次数。
发现两端问题其实求的内容差不多,修改一下,一并处理,当k为0时,字符为其本身。
代码如下:
#include<stdio.h>#include<string.h>#define M 105char A[M],B[M];int n,dp[M][M][30];int min(int a,int b){return a>b?b:a;}int dfs(int L,int R,int c){//[L,R]这个区间被刷上c这个颜色还需要的次数 if(L>R)return 0; if(L==R){//c是A[L,R]的颜色 if(c==0)return A[L]!=B[L]; else return B[L]!=c; } int &t=dp[L][R][c]; if(t==-1){ t=1000000000; if(c==0){ if(A[L]==B[L])t=dfs(L+1,R,c); else{ for(int i=L;i<=R;i++)//从第一个字符向后刷到i if(B[i]==B[L])t=min(t,dfs(L,i,B[L])+1+dfs(i+1,R,c)); } }else{ if(c==B[L])t=dfs(L+1,R,c); else{ for(int i=L;i<=R;i++)//从第一个字符向后刷到i if(B[i]==B[L])t=min(t,dfs(L,i,B[L])+1+dfs(i+1,R,c)); } } } return t;}int main(){ scanf("%s %s",A+1,B+1); n=strlen(A+1); for(int i=1;i<=n;i++){ A[i]=A[i]-'a'+1; B[i]=B[i]-'a'+1; } memset(dp,-1,sizeof(dp)); printf("%d\n",dfs(1,n,0)); return 0;}
阅读全文
1 0
- 字符刷子
- 刷子表
- MFC4.钢笔和刷子
- 为刷子设置透明度
- COD4:Brush 刷子
- 使用点,刷子,笔进行绘图
- 当铜锅遇到铁刷子
- 多类型下载-格式刷子的实现
- 刷子 撸一撸手头的几把刷
- win32开发(画笔、刷子、字体)
- [VB.NET源码]刷子可以变化着刷背景图
- [Visual C++系列]2.3 使用点,刷子,笔进行绘图
- listview中adapter不使用notifyDataSetChanged单刷子item
- 问题链接:HDU5319 Painter。 本题可以使用深度优先搜索求解。 红色刷子("R"刷子)按“\”的方向刷,蓝色刷子("B"刷子)按"/"方向刷。一个地方如果被两次刷到变成绿色("G"色)。
- 解密刷子是如何进行APP刷量的?
- 冲击百度seo首页需要两把刷子
- combox下拉框中显示系统颜色和刷子的下拉条
- GetStockObject 检索预定义的备用笔、刷子、字体或者调色板
- ubuntu16.04下软件安装
- HDOJ(航电)题目分类大全
- 面向对象的类关系及其C++实现
- 全硬件TCP/IP协议栈学习笔记(第三天:TCP/IP协议学习三)
- Java 数据结构
- 字符刷子
- servlet
- Java 集合框架
- 组合数取模之逆元方法+模板
- socket编程之select
- Java面试参考指南一
- 自定义MapReduce导入HDFS数据到HBase
- 关于C++ return *this的理解
- 以css为例谈设计模式