HDU 2476 区间dp
2014-03-12 01:25
316 查看
String painter
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1410 Accepted Submission(s): 606
[align=left]Problem Description[/align]
There are two strings A and B with equal length. Both strings are made up of lower case letters. Now you have a powerful string painter. With the help of the painter, you can change a segment of characters of a string to any other
character you want. That is, after using the painter, the segment is made up of only one kind of character. Now your task is to change A to B using string painter. What’s the minimum number of operations?
[align=left]Input[/align]
Input contains multiple cases. Each case consists of two lines:
The first line contains string A.
The second line contains string B.
The length of both strings will not be greater than 100.
[align=left]Output[/align]
A single line contains one integer representing the answer.
[align=left]Sample Input[/align]
zzzzzfzzzzz
abcdefedcba
abababababab
cdcdcdcdcdcd
[align=left]Sample Output[/align]
6
7
[align=left]Source[/align]
2008 Asia Regional Chengdu
给定两个字符串,每一次可以把某一段刷为同一个字母,求最少刷多少次,可以把字符串1刷为字符串2。
区间dp,先对字符串2进行预处理,然后扫描得出答案。
代码:
/* *********************************************** Author :xianxingwuguan Created Time :2014/3/12 0:09:36 File Name :1.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; char s1[105],s2[105]; int dp[105][105];//dp[i][j]为i~j的刷法 int ans[105],i,j,k,len; int main() { while(~scanf("%s%s",s1,s2)){ len = strlen(s1); memset(dp,0,sizeof(dp)); for(j = 0; j<len; j++) for(i = j; i>=0; i--)//j为尾,i为头 { dp[i][j] = dp[i+1][j]+1;//先每个单独刷 for(k = i+1; k<=j; k++)//i到j中间所有的刷法 if(s2[i]==s2[k]) dp[i][j] = min(dp[i][j],(dp[i+1][k]+dp[k+1][j]));//i与k相同,寻找i刷到k的最优方案 } for(i = 0; i<len; i++)ans[i] = dp[0][i];//根据ans的定义先初始化 for(i = 0; i<len; i++){ if(s1[i] == s2[i])ans[i] = ans[i-1];//如果对应位置相等,这个位置可以不刷 else{ for(j = 0; j<i; j++)ans[i] = min(ans[i],ans[j]+dp[j+1][i]);//寻找j来分割区间得到最优解 } } printf("%d\n",ans[len-1]); } return 0; }
相关文章推荐
- 001_019 Python 检查字符串中的结束字符
- 关于当前搭建Spring Mvc和hibernate框架接口的总结
- 前言和第一章.NET的体系结构
- SQL SERVER中CUME_DIST和PERCENT_RANK函数
- highchars
- Struts2拦截器获取session
- codeforces#235_div2_C Team 简单构造
- codeforces#235_div2_C Team 简单构造
- 【MyGui 3.2.0 开发之一】 编译(OpenGL平台)
- [ACM_水题] UVA 11292 Dragon of Loowater [勇士斗恶龙 双数组排序 贪心]
- 【C#基础学习】学习日记1
- Ubuntu系统服务详解
- JSON格式
- 创建型模式のAbstractFactory抽象工厂模式
- 类豌豆荚: Linux Mint实测QtADB安卓管理客户端
- poj2524_并查集基础
- Android中相对布局RelativeLayout各个属性的含义
- Java中abstract和interface的区别
- Chrome的无痕浏览实现初探
- IOS检测网络连接状态(转)