P4170 CQOI2007 塗色 題解

2021-10-04 16:43:01 字數 3277 閱讀 2188

同步

原題鏈結

簡要題意:

一開始你有乙個長度為 n

nn 的無色串,每次可以對乙個區間染上相同的顏色。問最少多少次可以形成目標串。

告訴你,這題的藍是假的,太假了,資料也太弱了。

完全是個暴力選手亂碾標算用的,其實本題的時間複雜度完全可以做到 o(n

3)

o(n^3)

o(n3).

第一眼看資料範圍還以為是大力爆搜剪枝

用 fi,j

f_fi

,j​ 表示 [i,

j]

[i,j]

[i,j

] 區間形成目標串中 [i,

j]

[i,j]

[i,j

] 的最少次數。

如果 si=

sj

s_i = s_j

si​=sj

​,說明我們可以有兩種情況:

反正這倆相等,那麼 fi,

j=fi

+1,j

f_ = f_

fi,j​=

fi+1

,j​.

不然呢就是 fi,

j=fi

,j−1

f_ = f_

fi,j​=

fi,j

−1​.

即:fi,j

=min⁡(

fi+1

,j,f

i,j−

1)

f_ = \min(f_ , f_)

fi,j​=

min(fi

+1,j

​,fi

,j−1

​)即從區間兩端往內減少 111.

如果不相等,我們需要列舉中間數 k

kk,即把區間一分兩段。

f i,

j=

min⁡(f

i,k+

fk+1

,j)(

i≤

k

f_=\min(f_ + f_) (i \leq k < j)

fi,j​=

min(fi

,k​+

fk+1

,j​)

(i≤k

當然為了滿足無後效性,我們需要先列舉長度(即按照區間長度進行計算,而不是按照左右端點)

此時我們興致勃勃的寫了乙個程式。

時間複雜度:o(n

2)

o(n^2)

o(n2).

實際得分:60pt

s60pts

60pts.

#pragma gcc optimize(2)

#include

using

namespace std;

inline

intread()

int x=0;

while

(ch>=

'0'&& ch<=

'9') x=

(x<<3)

+(x<<1)

+ch-

'0',ch=

getchar()

;return x*f;

}int n,f[

101]

[101];

string s;

intmain()

printf

("%d\n"

,f[1

][n]);

return0;

}

為什麼會 wa

\text

wa 呢?你也許不太明白。

那你就別明白了,背**萬歲

本人發現,洛谷上置於樓頂的幾篇題解都是狀態轉移方程裡好好的 si=

sj

s_i = s_j

si​=sj

​,然後到**裡就是 si−

1=sj

−1

s_ = s_

si−1​=

sj−1

​,讓人難以明白。這裡特此說明!而且,如果有 si=

sj

s_i = s_j

si​=sj

​ 也大多是下標從 0

00 開始列舉的。

然後你測了一下樣例!

color 1.in

aaaaa

color 1.out

1color.out

2

???你不明白自己的程式為什麼會輸出 2

22???

然後你開始除錯,輸出所有區間的值,得到乙個結果是:

1 1 1

1 2 1

1 3 1

1 4 1

1 5 2

2 2 1

2 3 1

2 4 1

2 5 2

3 3 1

3 4 1

3 5 2

4 4 1

4 5 2

5 5 1

為什麼所有以 5

55 結尾的區間(除了元區間 [5,

5]

[5,5]

[5,5

]) 都有了錯誤的答案?

這就是因為,字串下標從 0

00 開始!!!

你訪問 s

5s_5

s5​ 是乙個空字元!

真是乙個大坑啊

時間複雜度:o(n

3)

o(n^3)

o(n3).

實際得分:100pt

s100pts

100pts

.

#pragma gcc optimize(2)

#include

using

namespace std;

inline

intread()

int x=0;

while

(ch>=

'0'&& ch<=

'9') x=

(x<<3)

+(x<<1)

+ch-

'0',ch=

getchar()

;return x*f;

}int n,f[

101]

[101];

string s;

intmain()

printf

("%d\n"

,f[1

][n]);

return0;

}

洛谷P4170 CQOI2007 塗色

假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...

P4170 CQOI2007 塗色 區間dp

假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...

洛谷 P4170 CQOI2007 塗色

假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...