您的位置:首页 > 大数据 > 人工智能

BZOJ1260: [CQOI2007]涂色paint

2014-11-11 11:05 393 查看
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1260

假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。 用尽量少的涂色次数达到目标。

n<=50

题解:搬运题解:

令f[i][j]代表将i开始的j个位置刷成相应颜色序列的最小次数,然后状态转移如下:

若s[i]==s[j] 则f[i][j]=min(f[i-1][j],f[i][j-1]) 即将i与右半部分并成一刷子,或者将j与左半部分并成一刷子

若s[i]!=s[j] 则f[i][j]=min{f[i][k]+f[i+k][j-k]} 其中1<=k<j

代码:

#include<cstdio>

#include<cstdlib>

#include<cmath>

#include<cstring>

#include<algorithm>

#include<iostream>

#include<vector>

#include<map>

#include<set>

#include<queue>

#include<string>

#define inf 1000000000

#define maxn 500+100

#define maxm 500+100

#define eps 1e-10

#define ll long long

#define pa pair<int,int>

#define for0(i,n) for(int i=0;i<=(n);i++)

#define for1(i,n) for(int i=1;i<=(n);i++)

#define for2(i,x,y) for(int i=(x);i<=(y);i++)

#define for3(i,x,y) for(int i=(x);i>=(y);i--)

#define mod 1000000007

using namespace std;

inline int read()

{

int x=0,f=1;char ch=getchar();

while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}

while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}

return x*f;

}
int n,f[maxn][maxn];
char s[maxn];

int main()

{

freopen("input.txt","r",stdin);

freopen("output.txt","w",stdout);

scanf("%s",s+1);n=strlen(s+1);
for1(i,n)f[i][i]=1;
for1(l,n-1)
for1(i,n-l)
{
int j=i+l;f[i][j]=inf;
if(s[i]==s[j])
{
if(l==1)f[i][j]=1;
else f[i][j]=min(f[i][j-1],f[i+1][j]);
}
else for2(k,i,j-1)f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
printf("%d\n",f[1]
);

return 0;

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: