HDU-2476 String painter

原创 2018年04月16日 10:58:06

挺有难度的一道题,区间DP,我参考别人的代码,自己加了写注释
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100+10;
const int INF=0x7f7f7f7f;
char a[N],b[N];
int d[N][N],ans[N];
int main()
{
	while(~scanf("%s%s",a,b))
	{
		int l=strlen(b);
		memset(d,0,sizeof(d));
		for(int i=0;i<l;i++)
			d[i][i]=1;
		//先求将一个空串转换成b需要的最少步数,d[l][r]代表l~r区间
		for(int i=1;i<l;i++)
			for(int j=0;j+i<l;j++)
			{//如果左右端相同,可以开始直接将整个区间刷为一色,不需要再加一步
				d[j][j+i]=d[j+1][j+i]+(b[j]==b[j+i]?0:1); 
				for(int k=j+1;k<j+i;k++) //遍历一遍区间
					if(b[j]==b[k]) //如果和左端相同,可以考虑拆分为两个区间,可能减少步数
						d[j][j+i]=min(d[j][j+i],d[j+1][k]+d[k+1][j+i]);
			}
		//ans[i]代表将前i位a转换成b需要的步数
		ans[0]=(a[0]==b[0]?0:1); //第一位相同则ans[0]为0
		for(int i=1;i<l;i++)
		{
			ans[i]=d[0][i]; //初始值为将空串转化为b串0~i的步数
			if(a[i]==b[i]) //如果这一位相同,可以不管,是前一位的步数
				ans[i]=min(ans[i],ans[i-1]);
			for(int j=0;j<i;j++) //遍历区间0~i,考虑把前j+1~i为作为空串处理
				ans[i]=min(ans[i],ans[j]+d[j+1][i]);
		}

		printf("%d\n",ans[l-1]);
	}
	return 0;
}

String类

-
  • 1970年01月01日 08:00

HDU-2476 String painter(区间dp)

H - String painter  HDU - 2476  题意:给出两个字符串s1,s2,将s1串变为s2串,每次可以将连续的一个子串改成任意的一个字母,问最少需要操作多...
  • qq_31759205
  • qq_31759205
  • 2017-02-17 00:04:33
  • 262

HDU2476:String painter(区间DP)

Problem Description There are two strings A and B with equal length. Both strings are made up of low...
  • libin56842
  • libin56842
  • 2013-08-02 00:36:52
  • 5622

String painter(DP综合题:区间DP(两次DP))

Link:http://acm.hdu.edu.cn/showproblem.php?pid=2476 String painter Time Limit: 5000/20...
  • Enjoying_Science
  • Enjoying_Science
  • 2015-10-14 11:55:48
  • 591

hdu String painter(dp)

String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To...
  • Wiking__acm
  • Wiking__acm
  • 2012-12-21 11:03:45
  • 2418

hdu2476(区间dp)

String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To...
  • d_x_d
  • d_x_d
  • 2015-09-03 22:20:43
  • 313

String painter hdu2476(区间dp)

点击打开链接 String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (J...
  • xxtz_666
  • xxtz_666
  • 2017-07-28 21:15:01
  • 88

hdu 2476 String painter 动态规划

题意:给定两个字符串a和b,求最少需要对a进行多少次操作,才能将a变成b。每次操作时将a中任意一段变成任意一个字母所组成的段。 题解:动态规划题。dp[i][j]表示a中i到j段变成b需要的最少次数。...
  • a601025382s
  • a601025382s
  • 2013-10-07 13:10:42
  • 3218

HDU2476-String painter

String painter                                                                            Time Limi...
  • a664607530
  • a664607530
  • 2016-09-18 21:44:40
  • 197

String painter

题意: 将第一个串转变为第二个串所需的最少步数 思路: 由于可以取任意的段变成相同的字符,所以当遇到原串与目标不同时取目标的上一个与当前相同的字符将整个区间变为当前字符,操作加一,然后将中间这一...
  • deepquiet
  • deepquiet
  • 2016-03-16 20:32:53
  • 382
收藏助手
不良信息举报
您举报文章:HDU-2476 String painter
举报原因:
原因补充:

(最多只允许输入30个字)