【luogu P4170】【ybtoj 区间DP课堂过关 例题2】木板涂色 & [CQOI2007]涂色

76 篇文章 0 订阅
57 篇文章 0 订阅

【例题2】木板涂色 & [CQOI2007]涂色


Link

【ybtoj】【区间DP课堂过关】【例题2】木板涂色
【luogu】【P4170】 [CQOI2007]涂色
题面//因为不知道侵不侵权所以就是题面是私密的,有账号的直接看转送门就可了


题目大意

一个没有颜色的木板,给出最后要变成的颜色。
每次选一段连续的区间染上任意一种颜色,后面染的颜色会覆盖前面的颜色。
问要染成 给出的木板颜色 至少要操作多少次。


解题思路

f [ i ] [ j ] f[i][j] f[i][j]为染出 i i i j j j的颜色需要多少次

  • 如果 i i i j j j位置最终要染的颜色相同, f [ i ] [ j ] = m i n ( f [ i ] [ j − 1 ] , f [ i + 1 ] [ j ] ) f[i][j]=min(f[i][j-1],f[i+1][j]) f[i][j]=min(f[i][j1],f[i+1][j])
  • 如果不一样,需要找一个‘切割点’ m m m f [ i ] [ j ] = m i n ( f [ i ] [ j ] , f [ i ] [ m ] + f [ m + 1 ] [ j ] ) f[i][j]=min(f[i][j],f[i][m]+f[m+1][j]) f[i][j]=min(f[i][j],f[i][m]+f[m+1][j])

Code

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int maxn = 0x7fffffff; 
int n, f[100][100];
char s[100];

int demo(int l, int r) {
	if(s[l] == s[r])
		return min(f[l][r - 1], f[l + 1][r]);
	int ans = maxn;
	for(int m = l; m < r; m++)
		ans = min(ans, f[l][m] + f[m + 1][r]);
	return ans;
}

int main() {
	scanf("%s", s + 1);
	n = strlen(s + 1);
	for(int i = 1; i <= n; i++)
		f[i][i] = 1;
	for(int len = 2; len <= n; len++)
		for(int l = 1; l + len - 1 <= n; l++)
			f[l][l + len - 1] = demo(l, l + len - 1);
	printf("%d", f[1][n]);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值