小明的喷漆计划
时间限制: 5 Sec 内存限制: 128 MB提交: 22 解决: 17
[提交][状态][讨论版]
题目描述
小明极其喜欢涂鸦,总是在墙上涂上各种颜色的漆。现在小明得到一个任务,需要喷涂一段空白围墙,且单位长度内的颜色都是相同的。小明有一种喷涂工具,它可以给任意长度的一段墙面涂上任意颜色的漆,这样的操作计为一次操作。小明要完成这个任务,又想使得操作次数尽量少,就请你帮他解决这个问题吧。
输入
有多组输入数据。
每组包含一个长度不超过100的字符串(均由小写字母组成),代表需要涂鸦的墙面目标状态
输出
至少需要几次操作,可达到目标
样例输入
aaaaaa fedcbaabcdef aaabbbbb aaabbbaaa
样例输出
1 6 2 2
这道题的转移和括号序列的非常相似,如果l与r的颜色一则dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]-1)
否则dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
#include<algorithm> #include<iostream> #include<cmath> #include<cstring> #include<string> const int MAXN=107; using namespace std; int dp[MAXN][MAXN],len; char s[MAXN]; void dfs(int l,int r); int main() { while (~scanf("%s",s)) { len=strlen(s); memset(dp,-1,sizeof(dp)); dfs(1,len); printf("%d ",dp[1][len]); } } void dfs(int l,int r) { if (l==r) { dp[l][r]=1; return; } if (dp[l][r]!=-1) return; int res=MAXN*MAXN; for (int i=l;i<r;i++) { dfs(l,i);dfs(i+1,r); if (s[l-1]==s[r-1]) res=min(res,dp[l][i]+dp[i+1][r]-1); else res=min(res,dp[l][i]+dp[i+1][r]); } dp[l][r]=res; return; }