其他分享
首页 > 其他分享> > 洛谷P4170

洛谷P4170

作者:互联网

题目描述

假设你有一条长度为 55 的木板,初始时没有涂过任何颜色。你希望把它的 55 个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为 55 的字符串表示这个目标:RGBGR。

每次你可以把一段连续的木板涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木板涂成 RRRRR,第二次涂成 RGGGR,第三次涂成 RGBGR,达到目标。

用尽量少的涂色次数达到目标。

输入格式

输入仅一行,包含一个长度为 n 的字符串,即涂色目标。字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。

输出格式

仅一行,包含一个数,即最少的涂色次数。

思路

f[i][j]表示表示涂[i, j]区间内的字符串的最少次数
当i==j时,子串明显只需要涂色一次,于是f[i][j]=1。

当i!=j且s[i]==s[j]时,只需要在第一次涂色时顺便涂端点的格即可,于是f[i][j]=min(f[i][j-1],f[i+1][j]) (由于色可覆盖,因此第一次涂色是整个区间都涂成一种颜色)

当i!=j且s[i]!=s[j]时,我们需要考虑将子串断成两部分来涂色,于是需要枚举子串的断点,设断点为k,那么f[i][j]=min(f[i][j],f[i][k]+f[k+1][j])

以下的两个代码中一个加else,一个没加,但是都通过的了,原因是:在区间端点的颜色相同,然后在枚举区间中的点又可以得到一个相同颜色的格,那么在第一次涂色的时候都可以涂成一种颜色,因此可以加else。

输入:
AAAAA

输出:
1
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

const int maxn = 55;
const int INF = 0x3fffffff;

int f[maxn][maxn];  //f[i][j]表示涂[i, j]区间内的字符串的最少次数

int main()
{
	string str;
	cin >> str;
	fill(f[0], f[0] + maxn * maxn, INF);

	//初始化,只涂一个字符的次数为1
	for (int i = 0; i < str.length(); i++)
	{
		f[i][i] = 1;
	}


	for (int len = 2; len <= str.length(); len++)  //区间长度
	{
		for (int i = 0; i + len - 1 < str.length(); i++)
		{
			int j = i + len - 1;

			if (str[i] == str[j])
				f[i][j] = min(f[i][j - 1], f[i + 1][j]);
			for (int k = i; k <= j; k++)
				f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
		}
	}

	cout << f[0][str.length() - 1];
}
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

const int maxn = 55;
const int INF = 0x3fffffff;

int f[maxn][maxn];  //f[i][j]表示涂[i, j]区间内的字符串的最少次数

int main()
{
	string str;
	cin >> str;
	fill(f[0], f[0] + maxn * maxn, INF);

	//初始化,只涂一个字符的次数为1
	for (int i = 0; i < str.length(); i++)
	{
		f[i][i] = 1;
	}


	for (int len = 2; len <= str.length(); len++)  //区间长度
	{
		for (int i = 0; i + len - 1 < str.length(); i++)
		{
			int j = i + len - 1;

			if (str[i] == str[j])
				f[i][j] = min(f[i][j - 1], f[i + 1][j]);
			else
			{
				for (int k = i; k <= j; k++)
					f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);

			}
		}
	}

	cout << f[0][str.length() - 1];
}

标签:洛谷,str,int,len,maxn,P4170,涂色,include
来源: https://blog.csdn.net/weixin_51008985/article/details/120591547