luogu P4170ybtoj 区间DP课堂过关 例题2木板涂色 & [CQOI2007]涂色
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P4170ybtoj 区间DP课堂过关 例题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][j−1],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]);
}
以上是关于luogu P4170ybtoj 区间DP课堂过关 例题2木板涂色 & [CQOI2007]涂色的主要内容,如果未能解决你的问题,请参考以下文章
luogu P1880ybtoj 区间DP课堂过关 例题1石子合并 & [NOI1995] 石子合并
luogu P3372ybtoj线段树课堂过关例题2区间查改 &模板线段树 1
luogu P1352ybtoj 树形DP课堂过关 例题1树上求和 & 没有上司的舞会
luogu P4514ybtoj树状数组课堂过关差分 例题6区间修改区间查询 & 上帝造题的七分钟