DAY6 - T2
T2:
题目
题目描述
假设你有一条长度为 5 的木版,初始时没有涂过任何颜色。你希望把它的 5 个 单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为 5 的字符串表示这个目 标:RGBGR。
每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜 色。例如第一次把木版涂成 RRRRR,第二次涂成 RGGGR,第三次涂成 RGBGR, 达到目标。
用尽量少的涂色次数达到目标。
输入
输入仅一行,包含一个长度为 n 的字符串,即涂色目标。字符串中的每个字符都 是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。
输出
仅一行,包含一个数,即最少的涂色次数。
样例
输入
AAA
输出
1
输入
BACAABCA
输出
5
输入
EASKAKNSOJGSLSLGTNFDMTSSKPOFGBPPLOSEILDKDMQJSCFOII
输出
36
数据
对于前 50%的数据,n<=3
对于前 80%的数据, n<=8
对于 100%的数据, n<=50
题解
40%
搜索
#include <bits/stdc++.h>
using namespace std;
#define rep(i,h,t) for (int i=h;i<=t;i++)
#define dep(i,t,h) for (int i=t;i>=h;i--)
char c[20];
int b[20],a[20],n,ans;
void dfs(int x)
{
bool tt=1;
rep(i,1,n) if (a[i]==0) tt=0;
if (x>ans) return;
if (tt==1)
{
ans=min(ans,x);
return;
}
int d[20];
rep(i,1,n)
rep(j,i,n)
{
int t1=0;
bool t2=0;
rep(k,i,j)
if (a[k]==0)
{
if (t1==0) t1=b[k];
else if (b[k]!=t1) t2=1;
}
if (t2||t1==0) continue;
memcpy(d,a,sizeof(a));
rep(k,i,j) a[k]=b[k];
dfs(x+1);
memcpy(a,d,sizeof(d));
}
}
int main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
ios::sync_with_stdio(false);
ans=1e9;
cin>>c;
n=strlen(c);
rep(i,1,n) b[i]=c[i-1]-'A'+1;
dfs(0);
cout<<ans<<endl;
return 0;
}
100%
区间DP
#include <bits/stdc++.h>
using namespace std;
int N, f[52][52];
string a;
int main(){
cin >> a;
N = a.length();
memset(f,1e9+10,sizeof(f));
for(int i = 1;i <= N;i++){
f[i][i] = 1;
}
for(int len = 2; len <= N; len++){
for(int i = 1; i <= N - len + 1; i++){
int head = i, tail = i + len - 1;
if(a[head-1] == a[tail-1]){
f[head][tail] = min(f[head + 1][tail], f[head][tail-1]);
continue;
}
for(int k = head; k <= tail; k++){
f[head][tail] = min(f[head][k] + f[k+1][tail], f[head][tail]);
}
}
}
cout << f[1][N];
}
没有未来的未来不是我想要的未来

浙公网安备 33010602011771号