P4170 [CQOI2007] 涂色

1|0P4170 [CQOI2007] 涂色

1|1基本思路

很容易口胡一个状态。

Fl,r 表示 chlchr 的最小操作次数。

然而转移就开始满头大汗。

1|2状态转移

只想到 Fi,i=1

以及肯定有 Fl,r=min(Fl,r,Fl,k+Fk+1,r)

但是不知道什么情况用。

看了题解,果然是转移上没想出来。

对于 Fl,r

  • 如果 chl=chr
    • 显然从以 l 开头的 r1 区间内的第一次涂色多涂一个就能达到当前状态。
    • Fl,r=Fl,r1
  • 如果 chlchr
    • 不显然,枚举断点求两个子区间的和的最小值。
    • Fl,r=min(Fl,r,Fl,k+Fk+1,r)

因为不那么理解,我把dp每次更新时的状态都打印了下来,然后理解了原理。

对于数据:

RGBGR

这样处理

ch is not equal:F[1][1] = 1 F[2][2] = 1 F[1][2] = 2 ch is not equal:F[2][2] = 1 F[3][3] = 1 F[2][3] = 2 ch is not equal:F[3][3] = 1 F[4][4] = 1 F[3][4] = 2 ch is not equal:F[4][4] = 1 F[5][5] = 1 F[4][5] = 2 ch is not equal:F[1][1] = 1 F[2][3] = 2 F[1][3] = 3 ch is equal: F[2][4] = 2 ch is not equal:F[3][3] = 1 F[4][5] = 2 F[3][5] = 3 ch is not equal:F[1][1] = 1 F[2][4] = 2 F[1][4] = 3 ch is not equal:F[2][2] = 1 F[3][5] = 3 F[2][5] = 4 ch is not equal:F[2][4] = 2 F[5][5] = 1 F[2][5] = 3 ch is equal: F[1][5] = 3

1|3代码实现

#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; char ch[56]; int n; int F[56][56]; int main() { scanf("%s", ch + 1); n = strlen(ch + 1); memset(F, 0x7f, sizeof(F)); for (int i = 1; i <= n; i++) { F[i][i] = 1; } for (int i = 1; i < n; i++) { for (int j = 1; j + i <= n; j++) { for (int k = j; k < j + i; k++) { if(ch[j] == ch[j + i]) { F[j][j + i] = F[j][j + i - 1]; //printf("ch is equal: F[%d][%d] = %d\n",j,j+i,F[j][j+i]); break; } else { if (F[j][k] + F[k + 1][j + i] < F[j][j + i]) { F[j][j + i] = F[j][k] + F[k + 1][j + i]; //printf("ch is not equal:F[%d][%d] = %d F[%d][%d] = %d F[%d][%d] = %d\n",j,k,F[j][k],k+1,j+i,F[k + 1][j + i],j,j+i,F[j][j+i]); } } } } } cout << F[1][n]; return 0; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17843512.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示