LA 4394 String painter 区间DP -
题目地址:http://vjudge.net/problem/UVALive-4394
很明显的区间DP
区间DP的套路就是 d[i][j]的在区间 (i,j) 刷的次数
转移也一般是 d[i][j]->d[i][k]+d[k+1][j]; 也就是一个区间分成两个区间
那么对于这道题就是想想怎么转移,也就是怎么将一个区间转移成两个区间
d[i][j]->d[i][k]+d[k+1][j];
1. if t[i]==t[j] ,也就是i刷到j
2. if t[i]==t[k+1] ,也就是i刷到k+1
3 if t[k]==t[j] ,也就是k刷到j
4. 什么也不干
还应该保存刷的颜色,所以多加一维paint
d[i][j][p] 就表示区间(i,j) 且刷了p的次数
#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)
#define REPD(i,a,b) for(int i=a;i>=(int)(b);--i)
const int INF=0x3f3f3f3f;
char s[100+5],t[100+5];
int d[100+5][100+5][35];
int DP(int i,int j,int paint){if(i>j) return 0;int& ans=d[i][j][paint];if(ans!=-1) return ans;if(i==j) {if(t[i]-'a'==paint||(paint==30&&t[i]==s[i])) return 0;else return 1;}ans=j-i+1;if(t[i]==t[j]) ans=min(ans,DP(i+1,j-1,t[i]-'a')+(paint!=t[i]-'a'));REP(k,i,j){if(t[i]==t[k]) ans=min(ans,DP(i+1,k-1,t[i]-'a')+DP(k+1,j,paint)+(paint!=t[k]-'a'));if(t[k]==t[j]) ans=min(ans,DP(i,k-1,paint)+DP(k+1,j-1,t[k]-'a')+(paint!=t[k]-'a'));ans=min(ans,DP(i,k,paint)+DP(k+1,j,paint)); //什么也不干} return ans;
}
int main(int argc, char const *argv[])
{while(scanf("%s%s",s+1,t+1)==2){memset(d,-1,sizeof(d));printf("%d\n", DP(1,strlen(s+1),30)); //一开始设一个不可能的值30}return 0;
}
LA 4394 String painter 区间DP -相关推荐
- uva live 4394 String painter 间隔dp
// uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...
- HDU-2476 String painter 区间DP
题意:给你一个长度相等的A串和B串,每次可以把一个连续的区间刷成一个字母,问从A串到B串的最少操作数. 解法:虽然这类题一看到就知道是区间DP,但是之前只做过类似从空串变成某个串的题目,所以没想到怎么 ...
- UVALive 4394 String painter——dp
设ans[i]为区间[1,i]已经染好的最小花费 若s[i]=t[i],ans[i]=ans[i-1] 否则ans[i]=min{ans[j-1]+cost(j,i)},cost(j,i)为区间[j, ...
- UVALive 4394 String painter
题目大意:有两个字符串A,B,一次刷可以把A串一段刷成同一个字母,问至少要刷几次才能把A串变成B串.串长≤100. 本来以为是个很简单的区间DP,后来发现直接区间DP是不行的,这玩意有后效性:刷完一整 ...
- NYOJ 1067 Compress String(区间dp)
Compress String 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 One day,a beautiful girl ask LYH to help her ...
- [CF1107E]Vasya and Binary String【区间DP】
题目描述 Vasya has a string s of length n consisting only of digits 0 and 1. Also he has an array a of l ...
- hdu_2476_String painter(区间DP)
题目链接:hdu_2476_String painter 题意: 有a,b两字符串,现在你有一个刷子,每次可以任选一个区间,使这个区间变成你想要的字符,现在让你将a变成b,问最少刷多少次 题解: 考虑 ...
- HDU2476:String painter(区间dp)
原文地址:http://blog.csdn.net/a601025382s/article/details/12379565 原文作者:knownothing String painter Time ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
最新文章
- docker 连接容器
- 人脸识别的十大过程介绍
- 独家 | 送你12个关于数据科学学习的关键提示(附链接)
- 图像传感器与信号处理——详解图像传感器噪声
- 半导体二极管和晶体三极管
- pmp每日三题(2022年2月22日)
- daterangepicker 日期范围插件自定义 可选 年份
- AT4513-[AGC030D]InversionSum【dp】
- 2021未来职业规划以及对过去的总结
- flowable实战(三)flowable流程实例管理接口
- python基于值的内存管理模式_为什么说python采用的是基于值的内存管理模式
- Cisco交换机设置管理IP
- datagridview 排序后 选择不变_排序算法之插入排序
- display:none和visiblity:hidden区别
- Python 读取数据
- 浅谈JS各种宽高(clientHeight、scrollHeight、offsetHeight等)
- 电视android降低版本,电视猫旧版本下载-电视猫视频去升级版3.1.3 安卓版下载_飞翔下载...
- SWOT模板与方法论
- Molecule在GitHub与Gitee正式开源
- Feb14 小白《Linux就该这么学》学习笔记1