洛谷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