String painter (hdu 2476 DP好题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2476
题目大意:
给出两个等长的串S, T, 要将S变成T, 每次可以把S的连续的一段变成相同的字母,求最少操作数。
这题网上看了好多题解,理解了好久, 记录一下我的理解吧。
首先求出把空串变成T的最少次数。
dp[i][j] 表示把空串变成T[i ... j]的最少次数。
首先dp[i][j] = dp[i + 1][j].
然后有一个性质。如果两次染色的区间有交, 那么小的区间一定完全包含于大的区间(左右端点也不会重合), 且一定是大区间 在小区间之前染色(否则 小区间完全被覆盖 就没用了)。
如果不是这样, 可以改造一下区间 变成这样。
所以第一次染色 一定是[i, k], 然后T[k + 1, j]可以单独考虑(因为染色不能再和[i, k]有交了)。
那么如何选这个k呢?
只要考虑T[i] = T[k]的位置, 如果不是,可以调整染色区域长度 变成右端点的颜色和 T[i]一样。
然后有另外一个性质:
如果T[i] = T[j], dp[i][j] = dp[i + 1][j]. 只要第一次染色区域选择[i, j], 就可以和dp[i + 1][j] 对应起来。
综上 dp[i][j] = min{dp[i + 1][j] + 1, dp[i + 1][k] + dp[k][j] (T[i] == T[k]) }
最后根据dp数组再做一次DP。
ans[i] 表示考虑S[1 ... i] T[1 ... i]
如果S[i] == T[i] 显然ans[i] = ans[i - 1]
否则肯定有一段S的区间[k ... i] 都被刷子刷过。 那么这一段的情况就是dp[k][i].
所以ans[i] = min(ans[k] + dp[k + 1][i]).
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <set>
using namespace std; #define X first
#define Y second
#define N 110
#define M 500010 typedef long long ll;
const int INF = << ;
const int Mod = ; char s[N], t[N];
int dp[N][N], ans[N]; int main()
{
//freopen("in.in", "r", stdin);
//freopen("out.out", "w", stdout); while (scanf("%s %s", s + , t + ) != EOF)
{
int n = strlen(s + );
for (int i = ; i <= n; ++i) dp[i][i] = ;
for (int len = ; len <= n; ++len)
{
for (int i = ; i + len - <= n; ++i)
{
int j = i + len - ;
dp[i][j] = dp[i + ][j] + ;
for (int k = i + ; k <= j; ++k)
if (t[i] == t[k]) dp[i][j] = min(dp[i][j], dp[i + ][k] + dp[k + ][j]);
}
}
ans[] = (s[] != t[]);
for (int i = ; i <= n; ++i)
{
if (s[i] == t[i]) ans[i] = ans[i - ];
else
{
ans[i] = dp[][i];
for (int k = ; k < i; ++k)
ans[i] = min(ans[i], ans[k] + dp[k + ][i]);
}
}
printf("%d\n", ans[n]);
} return ;
}
String painter (hdu 2476 DP好题)的更多相关文章
- String painter HDU - 2476 -区间DP
HDU - 2476 思路:分解问题,先考虑从一个空串染色成 B串的最小花费 ,区间DP可以解决这个问题 具体的就是,当 str [ l ] = = str [ r ]时 dp [ L ] [ R ] ...
- HDU 2476 String painter(区间DP)
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDOJ 题目2474 String painter(区间DP)
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- String painter(区间DP)
There are two strings A and B with equal length. Both strings are made up of lower case letters. Now ...
- String painter (区间dp)
There are two strings A and B with equal length. Both strings are made up of lower case letters. Now ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- hdu 2845(dp基础题)
题意:容易理解. 分析:以后碰到这种类型的题,就要考虑把矩阵先按行来处理,再按列处理.先算出每行能够能够得到的最大值,然后按列处理即可. 代码实现: #include<stdio.h> # ...
- You Are Given a Decimal String... CodeForces - 1202B [简单dp][补题]
补一下codeforces前天教育场的题.当时只A了一道题. 大致题意: 定义一个x - y - counter :是一个加法计数器.初始值为0,之后可以任意选择+x或者+y而我们由每次累加结果的最后 ...
- UVALive 4394 String painter ——(区间DP)
其实这个dp过程有点似懂非懂...代码如下: #include <stdio.h> #include <algorithm> #include <string.h> ...
随机推荐
- super.getclass()的结果是父类还是子类?
package as; import java.util.Date; public class Test extends Date{ public static void main(String[] ...
- DOM BOM document window 区别
DOM 是为了操作文档出现的 API,document 是其的一个对象: BOM 是为了操作浏览器出现的 API,window 是其的一个对象. 使用下图讲解: 归DOM管的: E区:即doc ...
- Apache Drupal URL重写【转】
文章来源:http://www.cnblogs.com/ghj1976/archive/2010/07/19/1780844.html 在 drupal 跟目录下有个 .htaccess 文件, 这个 ...
- C#设计模式学习笔记-单例模式随笔
最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...
- 解决nginx到后端服务器Connection: close问题
以下是官方原文: By default, NGINX redefines two header fields in proxied requests, “Host” and “Connection”, ...
- php安全处理
1.php.ini 修改 open_basedir='d:\wwwroot' //配置只能访问指定的网站目录 2.php.ini 修改 disable_funcitons=system,passthr ...
- LINQ - 在Where條件式中使用in與not in(转载)
算算時間,接觸LINQ也有一個月的時間了,可以算是落伍兼新生,不過最近在寫專案的時候,遇到了在LINQ的Where條件式中要如何使用in與 not in呢!? 這時候真的只能坐在位子上仰天長笑,開始懷 ...
- 优化数据页面(22)——n:n的数据关系
设计要点:优化数据页面.界面设计.美化exce 阿金:那n::n就复杂了,你倒是想留有空间. 可是现实社会有时却不同意. 秀秀:唉.说的也是. 阿金:那怎么表达才合适啊? 秀秀:仅仅实用网格了. 阿金 ...
- vncviewer鼠标不同步问题
sh-4.1# virsh edit win7 把下面的参数: <input type='mouse' bus='ps2'/> 改成: <input type='tablet' bu ...
- C++语言基础(25)-C++格式化输出
一.使用控制符控制输出格式 #include <iostream> #include <iomanip>//不要忘记包含此头文件 using namespace std; in ...