小小粉刷匠

“lalala,我是一个快乐的粉刷匠”,小名一边快活地唱着歌,一边开心地刷着墙",兴致突然被打断,“小名,你今天如果刷不完这一栋楼的墙,那么你就等着被炒鱿鱼吧”,老板声嘶力竭的吼着。苦恼的小名因为不想被炒鱿鱼,所以希望尽量快地刷完墙,由于他本人的数学基础很差,他现在请你来帮助他计算最少完成每一堵墙需要刷多少次。每一面墙有n个段,对于每个段指定一个目标颜色ci。刚开始的时候所有的墙壁为白色,我们现在有一个刷子,刷子长度为k,刷子每次可以选择一种颜色,然后选择段数为(1~k)连续的墙段刷成选择的一种颜色。我们现在想要知道,为了把墙变成目标颜色,最少刷多少次(保证指定的目标颜色一定不为白色)。
输入描述:
对于每一个案例,我们第一行包括两个整数n,k(1<=n<=100,1<=k<=50,k<n),表示墙的长度为n,刷子的长度为k。第二行输入n个整数(c1c2…cn),(1<=ci<=256),表示对于墙的每一段指定的颜色。
输出描述:
输出一个数,表示小名最少刷多少次。
示例1
输入
复制
3 3
1 2 1
输出
复制
2
示例2
输入
复制
5 4
5 4 3 3 4
输出
复制
3

dp 刚开始做的是错误的 以为只要是前K个就可以放在一起刷 看来是错误的

#include<stdio.h>
#include<string.h>
#define INF (210000000)
int min(int,int); 
int main(void)
{
    int n,k,i;
    scanf("%d%d",&n,&k);
    int sz[n+1],jl[n+1][n+1];
    memset(jl,0,sizeof(jl));
    for(i = 1;i <= n;i++)
    {
        scanf("%d",&sz[i]);
        jl[i][i] = 1;
    }
    int len,l,r;
    for(len = 2;len <= n;len++)
    {
        for(l = 1;l+len-1 <= n;l++)
        {
        	r = l+len-1;
        	jl[l][r] = INF;
     		if(len <= k && sz[l] == sz[r])
        	{
        		jl[l][r] = jl[l][r-1];	
        	}
			int k;
			for(k = l;k < r;k++)
			{
				jl[l][r] = min(jl[l][r],jl[l][k]+jl[k+1][r]);
			}
        }
    }
    printf("%d",jl[1][n]);
    return 0;
}
int min(int a,int b)
{
	return a<b?a:b;
}
发布了37 篇原创文章 · 获赞 0 · 访问量 355

猜你喜欢

转载自blog.csdn.net/weixin_43191153/article/details/104433251