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];
} 
posted @ 2020-08-10 14:15  LT-Y  阅读(96)  评论(0)    收藏  举报